package com.tsmobile.app.data

/**
 * 输入验证工具。
 *
 * 对应 docs/implementation/12_主题与收尾.md 12.2 输入验证加固。
 */
object InputValidator {

    /**
     * 服务器地址验证。
     * 支持：域名、IP（v4/v6）、TSDNS、带端口。
     */
    fun validateServerAddress(input: String): ValidationResult {
        val trimmed = input.trim()
        if (trimmed.isEmpty()) {
            return ValidationResult(false, "请输入服务器地址")
        }
        // 去除协议前缀
        val addr = trimmed
            .removePrefix("ts3server://")
            .removePrefix("ts3://")
            .trimEnd('/')

        // 基本格式检查
        if (addr.contains(' ') || addr.length > 256) {
            return ValidationResult(false, "地址格式不正确")
        }

        // 端口检查（如果有）
        val parts = addr.split(":")
        if (parts.size == 2) {
            val port = parts[1].toIntOrNull()
            if (port == null || port !in 1..65535) {
                return ValidationResult(false, "端口范围 1-65535")
            }
        } else if (parts.size > 2) {
            // IPv6 地址 — 必须包含在 [] 中
            if (!addr.startsWith("[")) {
                return ValidationResult(false, "IPv6 地址需要用 [] 包裹")
            }
        }

        return ValidationResult(true)
    }

    /**
     * 昵称验证。
     */
    fun validateNickname(input: String): ValidationResult {
        val trimmed = input.trim()
        if (trimmed.isEmpty()) {
            return ValidationResult(false, "请输入昵称")
        }
        if (trimmed.length > 30) {
            return ValidationResult(false, "昵称最长 30 个字符")
        }
        // 检查非法字符（TeamSpeak 限制）
        val illegalChars = listOf("\\", "/", "|", "\n", "\r", "\t")
        for (ch in illegalChars) {
            if (trimmed.contains(ch)) {
                return ValidationResult(false, "昵称包含非法字符: '$ch'")
            }
        }
        return ValidationResult(true)
    }

    /**
     * 频道密码验证。
     */
    fun validateChannelPassword(input: String): ValidationResult {
        if (input.isEmpty()) {
            return ValidationResult(false, "请输入频道密码")
        }
        if (input.length > 100) {
            return ValidationResult(false, "密码过长")
        }
        return ValidationResult(true)
    }

    /**
     * 聊天消息验证。
     */
    fun validateMessage(input: String): ValidationResult {
        val trimmed = input.trim()
        if (trimmed.isEmpty()) {
            return ValidationResult(false, "消息不能为空")
        }
        if (trimmed.length > 1024) {
            return ValidationResult(false, "消息最长 1024 个字符")
        }
        return ValidationResult(true)
    }
}

/**
 * 验证结果。
 */
data class ValidationResult(
    val isValid: Boolean,
    val errorMessage: String = ""
)
