package langext

import (
	"errors"
	"fmt"
)

func FormatBytesToSI(b uint64) string {
	const unit = 1000
	if b < unit {
		return fmt.Sprintf("%d B", b)
	}
	div, exp := uint64(unit), 0
	for n := b / unit; n >= unit; n /= unit {
		div *= unit
		exp++
	}
	return fmt.Sprintf("%.1f %cB", float64(b)/float64(div), "kMGTPE"[exp])
}

func BytesXOR(a []byte, b []byte) ([]byte, error) {
	if len(a) != len(b) {
		return nil, errors.New("length mismatch")
	}

	r := make([]byte, len(a))

	for i := 0; i < len(a); i++ {
		r[i] = a[i] ^ b[i]
	}

	return r, nil
}

func FormatBytes(b int64) string {
	const unit = 1024
	if b < unit {
		return fmt.Sprintf("%d B", b)
	}
	div, exp := int64(unit), 0
	for n := b / unit; n >= unit; n /= unit {
		div *= unit
		exp++
	}
	return fmt.Sprintf("%.1f %ciB", float64(b)/float64(div), "KMGTPE"[exp])
}