package crypto

import (
	"crypto/rand"
	"encoding/hex"
	"io"
	mathrand "math/rand"
	"strconv"
	"time"
)

// 生成AES-128密钥的函数，符合市面规范
func GenerateSecretKey() (string, error) {
	key := make([]byte, 16) // 16字节密钥
	_, err := io.ReadFull(rand.Reader, key)
	if err != nil {
		return "", err
	}
	return hex.EncodeToString(key), nil
}

func GenerateSecretId() (string, error) {
	// 创建一个字节数组，用于存储随机数据
	bytes := make([]byte, 8) // 因为每个字节表示两个16进制字符

	// 读取随机字节到数组中
	_, err := rand.Read(bytes)
	if err != nil {
		return "", err
	}

	// 将字节数组转换为16进制字符串
	return hex.EncodeToString(bytes), nil
}

// GenerateTransactionID 生成16位数的交易单号
func GenerateTransactionID() string {
	length := 16
	// 获取当前时间戳
	timestamp := time.Now().UnixNano()

	// 转换为字符串
	timeStr := strconv.FormatInt(timestamp, 10)

	// 生成随机数
	mathrand.Seed(time.Now().UnixNano())
	randomPart := strconv.Itoa(mathrand.Intn(1000000))

	// 组合时间戳和随机数
	combined := timeStr + randomPart

	// 如果长度超出指定值，则截断；如果不够，则填充随机字符
	if len(combined) >= length {
		return combined[:length]
	}

	// 如果长度不够，填充0
	for len(combined) < length {
		combined += strconv.Itoa(mathrand.Intn(10)) // 填充随机数
	}

	return combined
}
