"use strict";
import { khcAlert } from '../component/alert/khcAlert.js';
import { fullMap } from '../fullMap.js';

/**
 * 全局错误处理中心
 * 统一接管 window.error 和 window.unhandledrejection，按异常类型分级提示
 */
class globalErrorHandler {
    static init() {
        this.bindWindowError();
        this.bindUnhandledRejection();
    }

    /**
     * 显示系统错误弹窗（带锁，防止重复弹窗）
     * @param {Object} alertData 弹窗数据 {title, text}
     */
    static showSystemErrorOnce(alertData) {
        if (this.isSystemErrorAlertShowing) {
            console.error('错误弹窗已在显示，跳过本次异常:', alertData);
            return;
        }
        this.isSystemErrorAlertShowing = true;
        khcAlert.showSystemError(alertData, () => {
            this.isSystemErrorAlertShowing = false;
        });
    }

    /**
     * 绑定 window.error：监听 JS 运行时错误和资源加载错误
     * 使用捕获阶段(true)才能拦截 img/script/link 的加载错误
     */
    static bindWindowError() {
        window.addEventListener('error', (event) => {
            // 资源加载错误静默处理，不弹阻断式弹窗
            if (event.target && (
                event.target.tagName === 'IMG'
                || event.target.tagName === 'SCRIPT'
                || event.target.tagName === 'LINK'
            )) {
                console.warn('资源加载失败:', event.target.src || event.target.href);
                return;
            }

            // JS 运行时错误：控制台保留堆栈，用户侧展示友好提示
            console.error('运行时错误:', event.message, event.error);
            this.showSystemErrorOnce({
                title: '页面异常',
                text: '请刷新页面重试，如问题持续请联系管理员'
            });
        }, true);
    }

    /**
     * 绑定 window.unhandledrejection：监听未处理的 Promise 异常
     */
    static bindUnhandledRejection() {
        window.addEventListener('unhandledrejection', (event) => {
            let maskObj = fullMap.getObj('mask');
            if (maskObj && maskObj.hide) {
                maskObj.hide();
            }

            // 防止重复弹窗
            if (this.isSystemErrorAlertShowing) {
                console.error('错误弹窗已在显示，跳过本次Promise异常:', event.reason);
                return;
            }

            const reason = event.reason;
            let alertData = {title: '系统繁忙', text: '请稍后重试'};

            // 1. 网络层错误（后端完全不通 / 超时）
            if (reason && (
                reason.code === 'ERR_BAD_RESPONSE'
                || reason.code === 'ERR_NETWORK'
                || reason.code === 'ECONNABORTED'
            )) {
                alertData = {title: '连接失败', text: '服务器暂时无法访问，请检查网络或稍后重试'};
            }
            // 2. 后端有响应但返回了业务错误（axios 拦截器未拦截到的情况）
            else if (reason && reason.response && reason.response.data && reason.response.data.message) {
                alertData = {title: '请求失败', text: reason.response.data.message};
            }
            // 3. 前端 JS 抛出的明确错误
            else if (reason instanceof Error && reason.message) {
                console.error('未处理的Promise异常:', reason);
                alertData = {title: '页面出错', text: '请刷新页面重试，如问题持续请联系管理员'};
            }
            // 4. 其他未知情况
            else {
                console.error('未知未处理异常:', reason);
                alertData = {title: '系统繁忙', text: '请稍后重试'};
            }

            this.showSystemErrorOnce(alertData);
        });
    }
}

export { globalErrorHandler };
