package utils

import (
	"crypto/md5"
	"encoding/hex"
	"math/rand"
	"regexp"
	"strconv"
	"strings"
	"time"
)

// 随机种子
var rnd = rand.New(rand.NewSource(time.Now().UnixNano()))

func MD5(data string) string {
	m := md5.Sum([]byte(data))
	return hex.EncodeToString(m[:])
}

func CheckPwd(pwd string) bool {
	compile := `([0-9a-z]+){6,12}|(a-z0-9]+){6,12}`
	reg := regexp.MustCompile(compile)
	flag := reg.MatchString(pwd)
	return flag
}

// 校验邮箱格式
func ValidateEmailFormatat(email string) bool {
	reg := regexp.MustCompile(RegularEmail)
	return reg.MatchString(email)
}

// 验证是否是手机号
func ValidateMobileFormatat(mobileNum string) bool {
	reg := regexp.MustCompile(RegularMobile)
	return reg.MatchString(mobileNum)
}

// 计算分页起始页
func StartIndex(page, pagesize int) int {
	if page > 1 {
		return (page - 1) * pagesize
	}
	return 0
}

// GetLikeKeywordPars 获取sql查询中的参数切片
func GetLikeKeywordPars(pars []interface{}, keyword string, num int) (newPars []interface{}) {
	newPars = pars
	if newPars == nil {
		newPars = make([]interface{}, 0)
	}
	for i := 1; i <= num; i++ {
		newPars = append(newPars, `%`+keyword+`%`)
	}
	return
}

func StringsToJSON(str string) string {
	rs := []rune(str)
	jsons := ""
	for _, r := range rs {
		rint := int(r)
		if rint < 128 {
			jsons += string(r)
		} else {
			jsons += "\\u" + strconv.FormatInt(int64(rint), 16) // json
		}
	}
	return jsons
}

// 数据没有记录
func ErrNoRow() string {
	return "<QuerySeter> no row found"
}

func GetRandStringNoSpecialChar(size int) string {
	allLetterDigit := []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}
	randomSb := ""
	digitSize := len(allLetterDigit)
	for i := 0; i < size; i++ {
		randomSb += allLetterDigit[rnd.Intn(digitSize)]
	}
	return randomSb
}

func GetOrmReplaceHolder(num int) string {
	var stringBuffer strings.Builder
	for i := 0; i < num; i++ {
		stringBuffer.WriteString("?")
		if i != num-1 {
			stringBuffer.WriteString(",")
		}
	}
	return stringBuffer.String()
}
