package str

import (
	"crypto/rand"
	"math/big"
)

func RandomString(n int) string {
	return randomString(n, "0123456789abcdefghijklmnopqrstuvwxyz")
}

func RandomBase62String(n int) string {
	return randomString(n, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
}

func randomString(n int, letters string) string {
	ret := make([]byte, n)
	for i := 0; i < n; i++ {
		num, err := rand.Int(rand.Reader, big.NewInt(int64(len(letters))))
		if err != nil {
			panic(err)
		}
		ret[i] = letters[num.Int64()]
	}

	return string(ret)
}

func ToString[T ~string](s T) string {
	return string(s)
}

func FromString[T ~string](s string) T {
	return T(s)
}

func TruncateRunes(value string, maxRunes int) string {
	runes := []rune(value)
	if len(runes) <= maxRunes {
		return value
	}
	return string(runes[:maxRunes])
}
