package lib

import (
	"crypto/md5"
	"encoding/hex"
	"github.com/shopspring/decimal"
	"math/rand"
	"strconv"
	"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, "")
}

// 返回一个32位md5加密后的字符串
func Md5(str string) string {
	h := md5.New()
	h.Write([]byte(str))
	return hex.EncodeToString(h.Sum(nil))
}

// 转化
func TimeStrToTime(T_time string) (time.Time, bool) {
	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
}
func DateStrToTime(T_date string) (time.Time, bool) {
	stamp, err := time.ParseInLocation("2006-01-02", T_date, time.Local) // +8
	if err != nil {
		return time.Time{}, false
	}

	return stamp, true
}

func MonthStrToTime(T_month string) (time.Time, bool) {
	stamp, err := time.ParseInLocation("2006-01", T_month, time.Local) // +8
	if err != nil {
		return time.Time{}, false
	}

	return stamp, true
}

func SplitStringIds(str string, prefix string) (r []string) {
	if len(str) == 0 {
		return r
	}
	Ids_str := strings.TrimRight(str, "|")
	Ids := strings.Split(Ids_str, "|")
	for _, v := range Ids {
		r = append(r, strings.TrimLeft(v, prefix))
	}
	return r
}

func SplitStringToDotStr(str string, prefix string) (r string) {
	if len(str) == 0 {
		return r
	}
	Ids_str := strings.TrimRight(str, "|")
	Ids := strings.Split(Ids_str, "|")
	for _, v := range Ids {
		r += strings.TrimLeft(v, prefix) + ","
	}
	r = strings.TrimRight(r, ",")
	return r
}

func SplitStringToIntIds(str string, prefix string) (r []int) {
	if len(str) == 0 {
		return r
	}
	Ids_str := strings.TrimRight(str, "|")
	Ids := strings.Split(Ids_str, "|")
	for _, v := range Ids {
		id, _ := strconv.Atoi(strings.TrimLeft(v, prefix))
		r = append(r, id)
	}
	return r
}

func IntIdsDistinct(Ids []int) (result []int) {
	distinctMap := make(map[int]int, len(Ids))
	for _, Id := range Ids {
		if _, ok := distinctMap[Id]; !ok {
			distinctMap[Id] = 1
			result = append(result, Id)
		}
	}
	return result
}

func SplitString(str string, cutset string) (r []string) {
	if len(str) == 0 {
		return r
	}
	list := strings.Split(strings.TrimRight(str, cutset), cutset)

	return list
}

// string转float64保留2位小数
func StringToFloat64TwoDecimal(str string) float64 {
	temp, _ := strconv.ParseFloat(str, 64)
	f, _ := decimal.NewFromFloat(temp).Round(2).Float64()
	return f
}
