package user

import (
	"net/url"
	"strings"
	"time"
	"unicode"
	"unicode/utf8"
)

const (
	// ProfileBirthDateLayout 是 users.birth_date 的唯一外部日期格式，不携带时区。
	ProfileBirthDateLayout = "2006-01-02"
	// ProfileUsernameMaxRunes 必须和 users.username VARCHAR(64) 保持一致。
	ProfileUsernameMaxRunes = 64
	// ProfileAvatarMaxRunes 必须和 users.avatar VARCHAR(512) 保持一致。
	ProfileAvatarMaxRunes = 512
	// ProfileContactInfoMaxRunes 必须和 users.contact_info VARCHAR(128) 保持一致。
	ProfileContactInfoMaxRunes = 128
	// WithdrawUSDTTRC20AddressMaxRunes 必须和 users.withdraw_usdt_trc20_address VARCHAR(128) 保持一致。
	WithdrawUSDTTRC20AddressMaxRunes = 128
	// ProfileGenderMaxRunes 必须和 users.gender VARCHAR(32) 保持一致。
	ProfileGenderMaxRunes = 32
)

// ProfileStringTooLong 按字符数校验 VARCHAR 边界，避免中文昵称按 UTF-8 字节数误拒。
func ProfileStringTooLong(value string, maxRunes int) bool {
	return utf8.RuneCountInString(value) > maxRunes
}

// ValidProfileBirthDate 校验生日只使用 yyyy-mm-dd，避免客户端时区解析造成日期偏移。
func ValidProfileBirthDate(value string) bool {
	parsed, err := time.Parse(ProfileBirthDateLayout, value)
	if err != nil {
		return false
	}

	// MySQL DATE 在严格模式下不能写入 Go 零值年份；注册入口必须先拦截，避免写库阶段退化为 INTERNAL_ERROR。
	return parsed.Year() >= 1000
}

// ValidProfileAvatarURL 限制头像为绝对 HTTP(S) URL，防止展示资料写入不可渲染或危险 scheme。
func ValidProfileAvatarURL(raw string) bool {
	parsed, err := url.Parse(raw)
	if err != nil || parsed.Host == "" {
		return false
	}
	if parsed.Scheme != "http" && parsed.Scheme != "https" {
		return false
	}

	return !strings.ContainsAny(raw, " \t\r\n")
}

// ValidUSDTTRC20Address 校验用户默认提现地址的最小链路约束。
func ValidUSDTTRC20Address(raw string) bool {
	// TRON 主网 Base58 地址固定 34 位且以 T 开头；这里只做格式闸门，链上有效性由后续提现审核/打款流程处理。
	if len(raw) != 34 || raw[0] != 'T' {
		return false
	}
	for _, r := range raw {
		if r > unicode.MaxASCII || !strings.ContainsRune("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", r) {
			return false
		}
	}

	return true
}
