import axios from "axios";
import {
    ElNotification,
    ElMessageBox,
    ElMessage,
} from "element-plus";
import { tansParams } from "@/utils/ruoyi";
import { generateSign } from "@/utils/tools";
import cache from "@/plugins/cache";
import { getToken, removeToken } from "@/utils/auth";
import router from '@/router';
import { useMeterStore } from '@/stores/modules/meter.js'

axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";

// 动态获取 baseURL
const getBaseURL = () => {
    // 开发环境使用配置的完整 URL
    if (import.meta.env.DEV) {
        return import.meta.env.VITE_APP_BASE_API;
    }

    // 生产环境使用相对路径
    // 返回空字符串，让浏览器自动使用当前域名
    return '';

    // 或者如果后端 API 有固定路径前缀，可以这样设置：
    // return '/api'; // 这样请求会变成 https://当前域名/api/xxx
};

// 创建axios实例
const service = axios.create({
    // axios中请求配置有baseURL选项，表示请求URL公共部分
    // baseURL: import.meta.env.VITE_APP_BASE_API,
    baseURL: getBaseURL(),
    // 超时
    // timeout: 10000,
});

// request拦截器
service.interceptors.request.use(
    async (config) => {
        // 在拦截器内部安全地使用 store 
        let sudid = ''
        try {
            const meterStore = useMeterStore()
            if (!meterStore.udid) {
                meterStore.initUdid();
                sudid = meterStore.getSudid();
            } else {
                sudid = meterStore.getSudid();
            }
        } catch (error) {
            console.warn('MeterStore 初始化失败:', error);
        }

        // 是否需要设置 token
        const isToken = (config.headers || {}).isToken === false;
        if (getToken() && !isToken) {
            config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
        }

        // 是否需要防止数据重复提交
        const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
        if (sudid) {
            config.headers["X-User-Agent"] = `gxtech/web 1.0.0: c=GxTech, udid=${sudid}, sv=15.4.1, app=stt`;
        }
        // get请求映射params参数
        if (config.method === "get" && config.params) {
            let url = config.url + "?" + tansParams(config.params);
            url = url.slice(0, -1);
            config.params = {};
            config.url = url;
        }
        if (
            !isRepeatSubmit &&
            (config.method === "post" || config.method === "put")
        ) {
            const requestObj = {
                url: config.url,
                data:
                    typeof config.data === "object"
                        ? JSON.stringify(config.data)
                        : config.data,
                time: new Date().getTime(),
            };
            const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
            const limitSize = 5 * 1024 * 1024; // 限制存放数据5M
            if (requestSize >= limitSize) {
                console.warn(
                    `[${config.url}]: ` +
                    "请求数据大小超出允许的5M限制，无法进行防重复提交验证。"
                );
                return config;
            }
            const sessionObj = cache.session.getJSON("sessionObj");
            if (
                sessionObj === undefined ||
                sessionObj === null ||
                sessionObj === ""
            ) {
                cache.session.setJSON("sessionObj", requestObj);
            } else {
                const s_url = sessionObj.url; // 请求地址
                const s_data = sessionObj.data; // 请求数据
                const s_time = sessionObj.time; // 请求时间
                const interval = 1000; // 间隔时间(ms)，小于此时间视为重复提交
                if (
                    s_data === requestObj.data &&
                    requestObj.time - s_time < interval &&
                    s_url === requestObj.url
                ) {
                    const message = "数据正在处理，请勿重复提交";
                    console.warn(`[${s_url}]: ` + message);
                    return Promise.reject(new Error(message));
                } else {
                    cache.session.setJSON("sessionObj", requestObj);
                }
            }
        }
        console.log(sudid,'sudid')
        // 生成sign并添加到URL
        if (sudid) {
            try {
                const now = Date.now();
                const sign = await generateSign(config, sudid, now);
                if (sign) {
                    // 将sign添加到URL
                    const separator = config.url.includes('?') ? '&' : '?';
                    config.url += `${separator}sign=${encodeURIComponent(sign)}`;
                }
            } catch (signError) {
                console.error('添加sign失败:', signError);
            }
        }

        return config;
    },
    (error) => {
        Promise.reject(error);
    }
);

let isShowingError = false;
const showError = (message) => {
    if (isShowingError) return;
    isShowingError = true;

    ElMessage({
        message,
        type: 'error',
        duration: 3000
    });

    setTimeout(() => {
        isShowingError = false;
    }, 2000);
};



service.interceptors.response.use(
    (response) => {
        try {
            // console.log('原始响应:', response);
            // 1. 检查响应是否存在
            if (!response) {
                ElMessage.error('无响应数据');
                return Promise.reject(new Error('无响应数据'));
            }
            // 2. 安全获取响应数据和状态码
            const responseData = response.data || {};
            const statusCode = response.status;
            const businessCode = responseData.meta?.code || statusCode;

            // 3. 二进制数据直接返回
            if (
                response.request.responseType === 'blob' ||
                response.request.responseType === 'arraybuffer'
            ) {
                return responseData;
            }

            // console.log('响应数据:', responseData);

            // 4. 根据业务码处理不同情况
            switch (businessCode) {
                case 200:
                case 201:
                    return Promise.resolve(responseData);
                case 401:
                    // return Promise.resolve(responseData);
                    // const currentPath = router.currentRoute.value.name;
                    //  if(currentPath == 'ConferencingRoom'){
                    //     return Promise.resolve(responseData);
                    //  }else{
                    return handleUnauthorized()
                // .then(() => {
                //     return Promise.reject({ code: 401, message: '未授权' });
                // });
                //  } 
                case 500:
                    const serverErrorMsg = responseData.meta?.message || responseData.meta?.msg || '服务器内部错误';
                    ElMessage({ message: serverErrorMsg, type: 'error' });
                    return Promise.reject({ code: 500, message: serverErrorMsg });

                default:
                    const errorMsg = responseData.meta?.message || responseData.meta?.msg || `业务错误 (${businessCode})`;
                    ElNotification.error({ title: errorMsg });
                    return Promise.reject({ code: businessCode, message: errorMsg });
            }
        } catch (err) {
            console.error('响应拦截器异常:', err);

            showError('响应处理异常');

            return Promise.reject({
                code: -1,
                message: '响应处理异常',
                raw: err
            });
        }
    },
    // (error) => {
    //     let { message } = error;
    //     let code = error?.response?.status || -1;
    //     if (message == 'Network Error') {
    //         message = '后端接口连接异常';
    //         ElMessage({ message, type: 'error', duration: 5 * 1000 });
    //     } else if (message.includes('timeout')) {
    //         message = '系统接口请求超时';
    //         ElMessage({ message, type: 'error', duration: 5 * 1000 });
    //     } else if (message.includes('Request failed with status code')) {
    //         // message = '系统接口' + message.substr(message.length - 3) + '异常';
    //     }

    //     // 返回结构化错误
    //     return Promise.reject({
    //         code,
    //         message,
    //         raw: error // 保留原始 error
    //     });
    // }

    (error) => {
        try { 
            let message = error?.message || '请求失败';
            let code = error?.response?.status || -1; 
            if (message === 'Network Error') {
                message = '后端接口连接异常';
            } else if (message.includes('timeout')) {
                message = '系统接口请求超时';
            }
            else if (code) {
                const statusMap = {
                    400: '请求参数错误',
                    401: '登录已过期，请重新登录',
                    403: '没有权限访问',
                    404: '请求资源不存在',
                    408: '请求超时，请稍后重试',
                    409: '数据冲突，请刷新后重试',
                    422: '参数校验失败',

                    500: '服务器异常，请联系管理员',
                    501: '功能暂未实现',
                    502: '服务器内部错误，请联系管理员',
                    503: '服务繁忙，请稍后重试',
                    504: '服务器响应超时，请稍后重试'
                };

                message = message || statusMap[code];

                // 401 特殊处理（不影响你原逻辑）
                if (code === 401) {
                    return handleUnauthorized();
                }
            }
            showError(message);

            return Promise.reject({
                code,
                message,
                raw: error
            });
        } catch (err) {
            console.error('错误拦截器异常:', err);

            return Promise.reject({
                code: -1,
                message: '网络异常处理失败',
                raw: err
            });
        }
    }
);

// 单独处理401未授权
// function handleUnauthorized() {
//     return ElMessageBox.confirm(
//         '认证信息已失效，您可以继续留在该页面，或者重新登录',
//         '系统提示',
//         {
//             confirmButtonText: '重新登录',
//             cancelButtonText: '取消',
//             type: 'warning',
//         }
//     )
//         .then(() => {
//             removeToken()
//             if (router.currentRoute.path !== '/login') {
//                 router.push({
//                     path: '/login',
//                     query: { redirect: router.currentRoute.fullPath }
//                 });
//             } else {
//                 // 如果在登录页，强制刷新以清除残留状态
//                 window.location.reload();
//             }
//         })
//         .catch(() => {
//             return Promise.reject('用户取消操作');
//         });
// }

function handleUnauthorized() {
    removeToken();

    // 使用 nextTick 确保路由状态已更新
    import('vue').then(({ nextTick }) => {
        nextTick(() => {
            const currentPath = router.currentRoute.value.fullPath;
            if (router.currentRoute.value.path !== '/login') {
                router.push({
                    path: '/login',
                    query: {
                        redirect: currentPath !== '/login' ? currentPath : undefined
                    }
                });
            } else {
                window.location.reload();
            }
        });
    });
}

export default service;
