package utils

import (
	"crypto/rand"
	"fmt"
	"math/big"
	"strings"
)

// GenerateCode 生成指定长度的数字验证码
func GenerateCode(length int) (string, error) {
	if length <= 0 {
		return "", fmt.Errorf("code length must be positive")
	}

	var code strings.Builder
	for range length {
		digit, err := rand.Int(rand.Reader, big.NewInt(10))
		if err != nil {
			return "", fmt.Errorf("failed to generate random digit: %w", err)
		}
		code.WriteString(digit.String())
	}

	return code.String(), nil
}

// GenerateAlphaNumericCode 生成字母数字混合验证码
func GenerateAlphaNumericCode(length int) (string, error) {
	if length <= 0 {
		return "", fmt.Errorf("code length must be positive")
	}

	const charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	var code strings.Builder

	for range length {
		index, err := rand.Int(rand.Reader, big.NewInt(int64(len(charset))))
		if err != nil {
			return "", fmt.Errorf("failed to generate random character: %w", err)
		}
		code.WriteByte(charset[index.Int64()])
	}

	return code.String(), nil
}

// ValidatePhoneNumber 简单的手机号验证
func ValidatePhoneNumber(phone string) bool {
	if len(phone) < 10 || len(phone) > 15 {
		return false
	}

	// 检查是否都是数字或以+开头
	if phone[0] == '+' {
		phone = phone[1:]
	}

	for _, char := range phone {
		if char < '0' || char > '9' {
			return false
		}
	}

	return true
}

// NormalizePhoneNumber 标准化手机号
func NormalizePhoneNumber(phone string) string {
	// 移除所有非数字字符，除了+号
	var normalized strings.Builder
	for i, char := range phone {
		if char == '+' && i == 0 {
			normalized.WriteRune(char)
		} else if char >= '0' && char <= '9' {
			normalized.WriteRune(char)
		}
	}

	return normalized.String()
}
