package tool

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

var (
	letters   = []byte("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
	letterNum = []byte("0123456789")
	letterLow = []byte("abcdefghijklmnopqrstuvwxyz")
	letterCap = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
	letterSyb = []byte("!@#$%^&*()_+-=")
)

func RandomInt(max int64) int64 {
	num, _ := rand.Int(rand.Reader, big.NewInt(max))
	return num.Int64()
}

func RandomString(length int) string {
	result := make([]byte, length)
	for i := 0; i < length; i++ {
		num, _ := rand.Int(rand.Reader, big.NewInt(int64(len(letters))))
		result[i] = letters[num.Int64()]
	}
	return string(result)
}

func RandomPassword(length int, withSymbol bool) string {
	result := make([]byte, length)
	kind := 3
	if withSymbol {
		kind++
	}

	for i := 0; i < length; i++ {
		switch i % kind {
		case 0:
			num, _ := rand.Int(rand.Reader, big.NewInt(int64(len(letterNum))))
			result[i] = letterNum[num.Int64()]
		case 1:
			num, _ := rand.Int(rand.Reader, big.NewInt(int64(len(letterLow))))
			result[i] = letterLow[num.Int64()]
		case 2:
			num, _ := rand.Int(rand.Reader, big.NewInt(int64(len(letterCap))))
			result[i] = letterCap[num.Int64()]
		case 3:
			num, _ := rand.Int(rand.Reader, big.NewInt(int64(len(letterSyb))))
			result[i] = letterSyb[num.Int64()]
		}
	}
	return string(result)
}