/**
 * validators.js - 通用前端校验函数
 * 统一提供整数、端口、IPv4、掩码、MAC 等校验，避免各页面重复实现。
 *
 * 所有函数挂在全局作用域，供旧代码直接使用：
 * - isInteger(value)
 * - isValidPort(port, min, max)
 * - isValidIP(ip)
 * - isValidNetmask(mask)
 * - isValidMac(mac)
 */
(function (global) {
    'use strict';

    /**
     * 判断是否为整数（字符串或数字）
     * @param {string|number} value
     * @returns {boolean}
     */
    function isInteger(value) {
        if (typeof value === 'number') {
            return Number.isInteger(value);
        }
        if (typeof value === 'string') {
            var trimmed = value.trim();
            if (trimmed === '') return false;
            // 允许可选负号 + 纯数字
            if (!/^-?\d+$/.test(trimmed)) return false;
            var num = Number(trimmed);
            return Number.isInteger(num);
        }
        return false;
    }

    /**
     * 校验端口号是否在指定范围内
     * @param {string|number} port
     * @param {number} [min=1]
     * @param {number} [max=65535] 注意：保持与原有默认值一致
     * @returns {boolean}
     */
    function isValidPort(port, min, max) {
        min = (typeof min === 'number') ? min : 1;
        max = (typeof max === 'number') ? max : 65535;

        var num;
        if (typeof port === 'number') {
            num = port;
        } else if (typeof port === 'string' && port.trim() !== '') {
            num = Number(port.trim());
        } else {
            return false;
        }

        if (!Number.isInteger(num)) return false;
        return num >= min && num <= max;
    }

    /**
     * 校验 IPv4 地址是否合法
     * 使用与各页面 checkIp 相同的规则：每段 0-255
     * @param {string} ip
     * @returns {boolean}
     */
    function isValidIP(ip) {
        if (typeof ip !== 'string') return false;
        var trimmed = ip.trim();
        if (trimmed === '') return false;
        var pattern = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/;
        return pattern.test(trimmed);
    }

    /**
     * 校验 IPv4 子网掩码是否合法
     * 使用 NetworkSet/WifiSet 中已有的正则
     * @param {string} mask
     * @returns {boolean}
     */
    function isValidNetmask(mask) {
        if (typeof mask !== 'string') return false;
        var trimmed = mask.trim();
        if (trimmed === '') return false;
        var pattern = /^((254|252|248|240|224|192|128|0)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0))$/;
        return pattern.test(trimmed);
    }

    /**
     * 校验 MAC 地址是否合法（00:11:22:33:44:55）
     * @param {string} mac
     * @returns {boolean}
     */
    function isValidMac(mac) {
        if (typeof mac !== 'string') return false;
        var trimmed = mac.trim();
        if (trimmed === '') return false;
        var pattern = /^[a-fA-F\d]{2}(:[a-fA-F\d]{2}){5}$/;
        return pattern.test(trimmed);
    }

    /**
     * 校验 IPv6 地址是否合法（与后端 web_manager.cpp 的 ip6_stand / ip6_compress 正则一致）
     * 标准全写形式 或 :: 压缩形式
     * @param {string} addr
     * @returns {boolean}
     */
    function isValidIPv6(addr) {
        if (typeof addr !== 'string') return false;
        var trimmed = addr.trim();
        if (trimmed === '') return false;
        var ip6_stand = /^([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}$/;
        var ip6_compress = /^((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){0,5})?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){0,5})?)$/;
        return ip6_stand.test(trimmed) || ip6_compress.test(trimmed);
    }

    /**
     * 校验 IPv6 子网前缀长度是否合法（与后端一致：1-128）
     * @param {string|number} len
     * @returns {boolean}
     */
    function isValidIPv6Prefix(len) {
        var num;
        if (typeof len === 'number') {
            num = len;
        } else if (typeof len === 'string' && len.trim() !== '') {
            num = Number(len.trim());
        } else {
            return false;
        }
        if (!Number.isInteger(num)) return false;
        return num >= 1 && num <= 128;
    }

    // 导出主函数
    global.isInteger = isInteger;
    global.isValidPort = isValidPort;
    global.isValidIP = isValidIP;
    global.isValidNetmask = isValidNetmask;
    global.isValidMac = isValidMac;
    global.isValidIPv6 = isValidIPv6;
    global.isValidIPv6Prefix = isValidIPv6Prefix;

})(window);
