// 通用工具
// 秒寻科技
// zt 2024-01-04

package util

import (
	"bytes"
	"fmt"
	"io"
	"math/rand"
	"strings"

	"github.com/google/uuid"
	"golang.org/x/text/encoding/simplifiedchinese"
	"golang.org/x/text/transform"
)

// 默认字符串表
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%&*?"

// 项目编号字符串
const projectIdCharset = "0123456789ABCDEF"

// 生成 uuid
func GenerateUuid() string {
	uuid := uuid.New().String()
	return uuid
}

// 生成随机字符串
func GenRandomString(strLen int) string {
	sb := strings.Builder{}
	sb.Grow(strLen)
	for i := 0; i < strLen; i++ {
		sb.WriteByte(charset[rand.Intn(len(charset))])
	}
	return sb.String()
}

// 生成随机项目编号
// strLen:字符长度
// 返回值：项目编号ID
func GenRandomProjectID(strLen int) string {
	sb := strings.Builder{}
	sb.Grow(strLen)
	for i := 0; i < strLen; i++ {
		sb.WriteByte(projectIdCharset[rand.Intn(len(projectIdCharset))])
	}
	return sb.String()
}

// 去掉字符串中的空字符
func RemoveNullChars(s string) string {
	// 创建一个切片来存储结果字符串的字节
	var result []byte

	// 遍历输入字符串的每个字节
	for i := 0; i < len(s); i++ {
		// 检查当前字节是否是 \u0000（即空字符）
		if s[i] != 0 {
			// 如果不是空字符，则将其添加到结果切片中
			result = append(result, s[i])
		}
	}

	// 将结果切片转换回字符串并返回
	return string(result)
}

// 字符转换，将GBK格式（2字节标识一个汉字）的字符转成utf8字符(4字节表示一个汉字)
func CharTransGbToUtf8(gb2312Bytes []byte) ([]byte, error) {
	//创建一个 GB2312到 UTF-8 的转换器
	reader := transform.NewReader(bytes.NewReader(gb2312Bytes), simplifiedchinese.GB18030.NewDecoder())

	//读取转换后的 UTF-8 编码的字节切片
	utf8Bytes, err := io.ReadAll(reader)
	if err != nil {
		fmt.Println("Error converting encoding:", err)
		return nil, err
	}

	// 将 UTF-8 编码的字节切片转换为字符串并打印
	return utf8Bytes, nil
}

// 字符转换，将utf8格式(4字节表示一个汉字)转成GBK格式（2字节标识一个汉字）
func CharTransUtf8ToGb(utf8Bytes []byte) ([]byte, error) {
	var buf bytes.Buffer

	// 创建一个GB18030编码器
	encoder := simplifiedchinese.GB18030.NewEncoder()

	//将utf8转成gb
	_, err := transform.NewWriter(&buf, encoder).Write(utf8Bytes)
	if err != nil {
		return nil, err
	}

	//返回gb编码
	return buf.Bytes(), nil
}
