package uniqueid

import (
	"crypto/rand"
	"fmt"
	"math/big"
	"strings"
	"time"

	"github.com/google/uuid"
)

// GenerateID 生成UUID v1作为主键
func GenerateID() string {
	uuidV1, err := uuid.NewUUID()
	if err != nil {
		panic(err)
	}
	return uuidV1.String()
}

// GenerateName 生成随机用户名
func GenerateName(prefix string) string {
	str := uuid.New().String()
	return prefix + str[6:12]
}

// GenerateRandomCode 生成随机码(如邀请码)
func GenerateRandomCode(length int) string {
	const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
	var sb strings.Builder
	for i := 0; i < length; i++ {
		n, _ := rand.Int(rand.Reader, big.NewInt(int64(len(charset))))
		sb.WriteByte(charset[n.Int64()])
	}
	return sb.String()
}

// GenCodeKey 生成邀请码的Redis Key
func GenCodeKey(userID string) string {
	return fmt.Sprintf("code:%s", userID)
}

// GenOrderNo 生成订单号
func GenOrderNo() string {
	now := time.Now()
	timePart := now.Format("20060102150405")
	machineID := 1
	pid := now.Nanosecond() % 1000
	businessPart := fmt.Sprintf("%02d%03d%01d", machineID, pid, now.Second()%10)
	random1 := fmt.Sprintf("%04d", now.Nanosecond()%10000)
	random2 := fmt.Sprintf("%04d", (now.Nanosecond()/10000)%10000)
	return timePart + businessPart + random1 + random2
}
