package util

import (
	"encoding/base64"
	"fmt"
	qrcode "github.com/skip2/go-qrcode"
	"github.com/spf13/cast"
	"math/rand"
	"regexp"
	"strconv"
	"time"
)

func RandomStr(length int) string {
	str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
	bytes := []byte(str)
	result := []byte{}
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
	for i := 0; i < length; i++ {
		result = append(result, bytes[r.Intn(len(bytes))])
	}
	return string(result)
}

func CutTail(str string, length int) string {
	if len(str) <= length {
		return str
	}

	return str[0:length]
}

func FloatCut(f float64) float64 {
	return cast.ToFloat64(fmt.Sprintf("%.2f", f))
}

func CreateQrcodeBase64V2(content string, level qrcode.RecoveryLevel, size int) (string, error) {
	var png []byte
	//固定方法
	png, err := qrcode.Encode(content, level, size)
	if err != nil {
		return "", err
	}
	//文件流需要使用base64编码后才可使用
	return base64.StdEncoding.EncodeToString(png), nil
}

// ValidateIDCard 校验 18 位身份证号码
func ValidateIDCard(idCard string) bool {
	// 检查长度是否为 18 位
	if len(idCard) != 18 {
		return false
	}
	// 检查前 17 位是否为数字
	pattern := `^\d{17}[0-9Xx]$`
	match, _ := regexp.MatchString(pattern, idCard)
	if !match {
		return false
	}
	// 加权因子
	weight := []int{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}
	// 校验码对应值
	checkCodeList := []string{"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}
	// 计算前 17 位加权和
	sum := 0
	for i := 0; i < 17; i++ {
		num, _ := strconv.Atoi(string(idCard[i]))
		sum += num * weight[i]
	}
	// 计算校验码
	index := sum % 11
	checkCode := checkCodeList[index]
	// 比较校验码
	lastChar := string(idCard[17])
	if lastChar == "x" {
		lastChar = "X"
	}
	return lastChar == checkCode
}