package lib

import (
	"errors"
	"math/rand"
	"regexp"
	"strings"
	"time"
)

// #取得随机字符串：通过打乱slice来操作
func GetRandstring(length int, char string, rand_x int64) string {
	if length < 1 {
		return ""
	}

	if len(char) <= 6 || len(char) <= length {
		char = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
	}

	charArr := strings.Split(char, "")
	ran := rand.New(rand.NewSource(time.Now().UnixMilli() + rand_x))

	l := len(charArr)
	for i := l - 1; i > 0; i-- {
		r := ran.Intn(i)
		charArr[r], charArr[i] = charArr[i], charArr[r]
	}
	rchar := charArr[:length]
	return strings.Join(rchar, "")
}

// 检查日期格式
func IsDateStr(date string) bool {
	if _, err := time.Parse("2006-01-02", date); err != nil {
		return false
	}
	return true
}

// 转化
func TimeStrToTime(T_time string) (time.Time, bool) {
	if len(T_time) == 19 {
		stamp, err := time.ParseInLocation("2006-01-02 15:04:05", T_time, time.Local) // +8
		if err != nil {
			return time.Time{}, false
		}

		return stamp, true
	}

	stamp, err := time.ParseInLocation("2006-01-02 15:04", T_time, time.Local) // +8
	if err != nil {
		return time.Time{}, false
	}

	return stamp, true
}

func ParseTime(T_time string) time.Time {
	stamp, err := time.ParseInLocation("2006-01-02 15:04:05", T_time, time.Local) // +8
	if err != nil {
		return time.Time{}
	}

	return stamp
}

func ReplaceSeconds(timeStr string) (string, error) {
	length := len(timeStr)
	if length < 2 {
		return "", errors.New("时间格式不正确")
	}

	lastTwoDigits := timeStr[length-2:]
	if lastTwoDigits == "00" {
		return timeStr, nil
	}
	t, err := time.Parse("2006-01-02 15:04:05", timeStr)
	if err != nil {
		return "", err
	}

	roundedTime := t.Truncate(time.Minute) // 将时间截断到分钟级别
	roundedTimeString := roundedTime.Format("2006-01-02 15:04:00")

	return roundedTimeString, nil
}

// 判断字符串是否为纯数字
func IsNumeric(str string) bool {
	// 定义一个正则表达式来匹配纯数字字符串
	re := regexp.MustCompile(`^\d+$`)
	return re.MatchString(str)
}

func SubtractStringLists(list1, list2 []string) []string {
	// Create a map to store elements of list2 for fast lookup
	excludeMap := make(map[string]bool)
	for _, item := range list2 {
		excludeMap[item] = true
	}

	// Initialize the result slice with elements not present in list2
	var result []string
	for _, item := range list1 {
		if !excludeMap[item] {
			result = append(result, item)
		}
	}

	return result
}
