/**
 * 反调试工具
 *
 * - 仅在 H5 平台生效（其他平台条件编译后为空文件）
 * - 仅在生产构建生效，dev 环境完全无感
 * - 域名包含 "test" 关键字时跳过（测试服务器允许调试）
 * - 使用字符串拼接 + Function 构造，避免 terser 在压缩时识别并移除 debugger
 * - 循环触发 debugger 卡死调试器，同时通过暂停耗时检测 DevTools 是否被打开，
 *   一旦判定为调试状态立即跳转到空白页，防止用户继续观察页面 / 拦截请求
 */

// #ifdef H5
const PROD = import.meta.env.PROD
const TRAP_INTERVAL = 500 // 触发间隔（ms）
const DETECT_THRESHOLD = 200 // debugger 暂停超过此值判定为调试中（ms）
const REDIRECT_URL = 'about:blank' // 检测到调试时跳转目标
const TEST_DOMAIN_KEYWORD = 'test' // 域名包含此关键字时跳过反调试（测试服免调试干扰）

// 字符串拼接 + Function 构造，防止 terser/minifier 在压缩阶段移除 debugger 关键字
const trapBody = ['de', 'bug', 'ger'].join('')
// eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func
const trap = new Function(trapBody)

function isTestEnv(): boolean {
    try {
        return window.location.hostname.toLowerCase().includes(TEST_DOMAIN_KEYWORD)
    } catch (_) {
        return false
    }
}

let started = false
function startAntiDebug() {
    if (!PROD) return
    if (isTestEnv()) return
    if (started) return
    started = true

    const tick = () => {
        const start = Date.now()
        try {
            trap()
        } catch (_) {
            /* ignore */
        }
        if (Date.now() - start > DETECT_THRESHOLD) {
            try {
                window.location.href = REDIRECT_URL
            } catch (_) {
                /* ignore */
            }
        }
    }

    tick()
    setInterval(tick, TRAP_INTERVAL)
}

startAntiDebug()
// #endif

export {}
