package helper

import (
	"math/rand"
	"sort"
	"strconv"
	"strings"
	"time"
	"unicode"
)

func StringToInt64(s string) int64 {
	i, _ := strconv.ParseInt(s, 10, 64)
	return i
}

func StringToInt32(s string) int32 {
	i, _ := strconv.ParseInt(s, 10, 64)
	return int32(i)
}

// StringToInt32WithError 将字符串转换为int32
func StringToInt32WithError(s string) (int32, error) {
	i, err := strconv.ParseInt(s, 10, 64)
	if err != nil {
		return 0, err
	}
	return int32(i), nil
}

// StringToAsterisk 替换密钥中间字符为 *
func StringToAsterisk(value string) string {
	length := len(value)
	if length == 0 {
		return ""
	}
	asterisk := "*"
	if length < 4 {
		asterisk = strings.Repeat(asterisk, length)
		return strings.Replace(value, value, asterisk, 1)
	}

	offset := length / 4
	asterisk = strings.Repeat(asterisk, length-offset*2)
	return value[:offset] + asterisk + value[length-offset:]
}

func StrSuffixNumSort(in []string) []string {
	sort.Slice(in, func(i, j int) bool {
		return getSuffixNumber(in[i]) < getSuffixNumber(in[j])
	})
	var result []string
	for _, str := range in {
		result = append(result, str)
	}

	return result
}

// 获取字符串中最后面的后缀数字
func getSuffixNumber(s string) int {
	parts := strings.Split(s, "_")
	lastPart := parts[len(parts)-1] // 获取最后一个部分
	numStr := ""
	for i := len(lastPart) - 1; i >= 0; i-- {
		if _, err := strconv.Atoi(string(lastPart[i])); err == nil {
			numStr = string(lastPart[i]) + numStr
		} else {
			break
		}
	}
	num, _ := strconv.Atoi(numStr)
	return num
}

func GetRandomStr(length int) string {
	rand.Seed(time.Now().UnixNano())
	// 去掉容易搞错的字符,例如0,1,l,L,0,O,o,I,i
	const charset = "abcdefghjklmnpqrstuvwxyzABCDEFGHIJKMNPQRSTUVWXYZ123456789"
	password := make([]byte, length)
	for i := range password {
		password[i] = charset[rand.Intn(len(charset))]
	}
	return string(password)
}

func ToTitleFirst(s string) string {
	if s == "" {
		return s
	}
	runes := []rune(s)
	runes[0] = unicode.ToUpper(runes[0])
	return string(runes)
}