/**
 * 时间差判断工具类
 * 核心功能：判断目标时间与当前时间的差值是否小于指定秒数
 * 支持的目标时间格式：毫秒级时间戳、秒级时间戳、Date对象、合法时间字符串（如 "2026-02-12 10:00:00"）
 */
class TimeUtil {
    /**
     * 判断目标时间距离当前时间是否小于指定秒数
     * @param {String|Number|Date} targetTime 目标时间（支持多格式）
     * @param {Number} seconds 指定秒数（需为非负数字）
     * @returns {Boolean} true=时间差小于指定秒数；false=时间差大于/等于指定秒数或参数异常
     * @throws {Error} 当秒数参数不合法时抛出明确异常
     */
    static isLessThanSpecifiedSeconds(targetTime, seconds) {
        // 1. 严格校验秒数参数
        if (typeof seconds !== 'number' || isNaN(seconds) || seconds < 0) {
            throw new Error(`指定秒数不合法：${seconds}，请传入非负数字（如 90、60）`);
        }

        // 2. 转换目标时间为毫秒级时间戳（内部私有方法处理多格式兼容）
        const targetTimestamp = this._parseToMillisecondTimestamp(targetTime);
        if (targetTimestamp === null) return false; // 时间格式不合法时返回false

        // 3. 计算时间差（绝对值：兼容目标时间在当前时间之前/之后的场景）
        const nowTimestamp = Date.now();
        const timeDiffMs = Math.abs(nowTimestamp - targetTimestamp);

        // 4. 转换指定秒数为毫秒，判断是否小于（核心逻辑）
        const specifiedMs = seconds * 1000;
        return timeDiffMs < specifiedMs;
    }

    /**
     * 私有方法：统一转换任意时间格式为毫秒级时间戳
     * @param {String|Number|Date} time 待转换的时间
     * @returns {Number|null} 合法返回毫秒级时间戳，不合法返回null
     */
    static _parseToMillisecondTimestamp(time) {
        let timestamp;

        // 情况1：传入的是数字（秒级/毫秒级时间戳）
        if (typeof time === 'number') {
            // 区分秒级戳（10位）和毫秒级戳（13位）
            timestamp = time.toString().length <= 10 ? time * 1000 : time;
            // 校验时间戳有效性
            if (isNaN(timestamp) || timestamp < 0) {
                console.error(`时间戳不合法：${time}，需为非负数字`);
                return null;
            }
        }

        // 情况2：传入的是Date对象
        else if (time instanceof Date) {
            timestamp = time.getTime();
            if (isNaN(timestamp)) {
                console.error(`Date对象不合法：${time}`);
                return null;
            }
        }

        // 情况3：传入的是时间字符串（如 "2026-02-12 10:00:00"、"2026/02/12"）
        else if (typeof time === 'string') {
            const date = new Date(time);
            timestamp = date.getTime();
            if (isNaN(timestamp)) {
                console.error(`时间字符串格式不合法：${time}，请使用如 "2026-02-12 10:00:00" 的格式`);
                return null;
            }
        }

        // 情况4：不支持的类型
        else {
            return null;
        }

        return timestamp;
    }
}
export default TimeUtil;

// -------------------------- 测试用例 --------------------------
// // 测试1：目标时间是90秒前（判断是否小于100秒 → true）
// const test1 = TimeUtil.isLessThanSpecifiedSeconds(Date.now() - 90 * 1000, 100);
// console.log('测试1：', test1); // true
//
// // 测试2：目标时间是100秒前（判断是否小于90秒 → false）
// const test2 = TimeUtil.isLessThanSpecifiedSeconds(Date.now() - 100 * 1000, 90);
// console.log('测试2：', test2); // false
//
// // 测试3：传入时间字符串（判断是否小于60秒 → false）
// const test3Time = "2026-02-12 09:00:00";
// const test3 = TimeUtil.isLessThanSpecifiedSeconds(test3Time, 60);
// console.log('测试3：', test3); // false
//
// // 测试4：传入秒级时间戳（1740000000 → 转换为毫秒级，判断是否小于30秒）
// const test4 = TimeUtil.isLessThanSpecifiedSeconds(1740000000, 30);
// console.log('测试4：', test4); // 取决于当前时间，大概率false
//
// // 测试5：非法秒数（会抛出异常）
// try {
//     TimeUtil.isLessThanSpecifiedSeconds(Date.now(), -10);
// } catch (e) {
//     console.log('测试5（异常）：', e.message); // 指定秒数不合法：-10，请传入非负数字
// }