package models

import (
	"crypto/md5"
	"crypto/rand"
	"encoding/hex"
	"regexp"
	"strings"

	"time"
)

// 获取当前时间字符串
// 参数格式可选，默认"2006-01-02 15:04:05"
func GetCurrentTimeString(format ...string) string {
	// 默认格式
	layout := "2006_01_02-15_04_05.999999999"

	// 如果传入了格式参数则使用自定义格式
	if len(format) > 0 {
		layout = format[0]
	}

	return time.Now().Format(layout)
}

func StringToTimePtr(str string) (*time.Time, error) {
	layout := "2006-01-02 15:04"
	t, err := time.Parse(layout, str)
	if err != nil {
		return nil, err
	}
	return &t, nil
}

func RandStr32() string {
	// 生成 32 字节 (256 位) 随机数据
	b := make([]byte, 32)
	if _, err := rand.Read(b); err != nil {
		panic(err)
	}

	// 转换为 16 进制字符串 (长度 64)
	cookie := hex.EncodeToString(b)
	return cookie
}

func Md5Str(str string) string {
	hashBytes2 := md5.Sum([]byte(str))
	hashString2 := hex.EncodeToString(hashBytes2[:]) // 注意数组转切片的[:]
	return hashString2
}

func IsExpired(expireTime time.Time) bool {
	return expireTime.Before(time.Now())
}

// 判断邮箱是否合法
func IsEmailValid(email string) bool {
	// 正则表达式（覆盖 99% 常见邮箱格式）
	pattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
	regex := regexp.MustCompile(pattern)
	return regex.MatchString(email)
}

// 判断字符串是否包含标点符号
func IsContainsSpecialChar(str string) bool {
	specialChars := "!@#$%^&*()-+={}[]|\\:;\"'<>,.?/"
	return strings.ContainsAny(str, specialChars)
}
