//引入axios请求
import axios from 'axios'
//引入element-plus里面的消息提示
import {
    ElMessage
} from 'element-plus'

// Token管理
const TOKEN_KEY = 'auth_token'

// 定义全局控制器，以便在取消后重新赋值
let currentMainAbortController = new AbortController()

/**
 * 获取当前有效的 AbortSignal
 * 供 axios 拦截器和 fetch 请求共同使用
 */
export const getMainAbortSignal = () => {
    return currentMainAbortController.signal
}

/**
 * 取消所有正在进行的请求
 * 路由守卫中调用此方法
 */
export const cancelAllMainRequests = () => {
    // 1. 终止当前控制器的所有请求
    currentMainAbortController.abort()
    // 2. 创建一个新的控制器，供后续新请求使用
    currentMainAbortController = new AbortController()
}

// ===== 兼容导出（勿删）：历史代码仍会 import formatBearerAuthorization =====
// 说明：当前线上版本后端用 `token` 头，不用 Authorization；但为了不影响其它模块编译/运行，这里保留该方法导出。
const formatBearerAuthorization = (raw) => {
  const v = String(raw || "").trim()
  if (!v) return ""
  if (/^Bearer\s+/i.test(v)) return v
  return `Bearer ${v}`
}
// ===== 兼容导出（勿删）=====

// 获取token
const getToken = () => {
  // 固定 token（恢复原行为：所有请求都带这个 token）
  return 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYXRhLWNlbnRlciIsImF1ZCI6IndlYiIsImlzcyI6ImRhdGEtY2VudGVyIiwiZXhwIjozODI1ODM1NTkxLCJpYXQiOjE2NzgzNTE5NTMsImp0aSI6IjI4YmY1NTZjMTc0MDQ3YjJiNTExNWM3NzVhYjhlNWRmIiwidXNlcm5hbWUiOiJzdXBlcl91c2VyIn0.zHyVzsleX2lEqjDBYRpwluu_wy2nZKGl0dw3IUGnKNw'
    // return localStorage.getItem(TOKEN_KEY)
}

// 设置token
const setToken = (token) => {
    localStorage.setItem(TOKEN_KEY, token)
}

// 移除token
const removeToken = () => {
    localStorage.removeItem(TOKEN_KEY)
}

// 导出token管理方法
export { getToken, setToken, removeToken, formatBearerAuthorization }

// const BASE_API = import.meta.env.VITE_BASE_API
// 创建axios实例
const service = axios.create({
    // baseURL: BASE_API, //所有的后端接口请求地址前缀部分(没有后端请求不用写)
    timeout: 300 * 1000 // 请求超时时间,这里5分钟
    //withCredentials: true,// 异步请求携带cookie,true为携带,false为不携带
    //请求头里面设置通用传参类型
    /*headers: {
        //设置后端需要的传参类型
        'Content-Type': 'application/json',
        'token': 'x-auth-token',//一开始就要token
        'X-Requested-With': 'XMLHttpRequest',
    }*/
})

// request拦截器
service.interceptors.request.use(config => {
    // 获取token并添加到请求头
    const token = getToken()
    if (token) {
        // 根据curl命令，后端接受的是token字段名，而不是Authorization
        config.headers['token'] = token
        // config.headers['Authorization'] = `Bearer ${token}` // 如果后端需要Bearer格式可以使用这个
    }
    // 图表解读等 AI 分析服务（Vite 代理 /aiAnalysis）需要 X-API-Key
    const reqUrl = String(config.url || '')
    if (reqUrl.includes('aiAnalysis')) {
        const aiApiKey = import.meta.env.VITE_AI_ANALYSIS_API_KEY
        if (aiApiKey) {
            config.headers['X-API-Key'] = aiApiKey
        }
    }
    if (!config.signal) {
		config.signal = getMainAbortSignal()
	}
        
    return config
}, error => {
    console.log(error)
    return Promise.reject(error)
})

// response拦截器
service.interceptors.response.use(
    response => {
        //对数据返回做什么
        if (response.data.code == 0) {
            ElMessage({
                message: response.data.message,
                type: 'error',
                duration: 3 * 1000
            })
        }
        return response.data
    },
    error => {
        console.log('err' + error)

        const isCanceledError =
            error?.code === 'ERR_CANCELED' ||
            error?.name === 'CanceledError' ||
            error?.name === 'AbortError' ||
            (typeof error?.message === 'string' && /canceled/i.test(error.message))

        // 重复请求触发的取消不提示错误
        if (isCanceledError) return Promise.reject(error)

        // 特殊处理：用户信息接口可能在某些环境不存在（404），此时不弹出错误提示
        // 需求：GET /api/sso/user/info 返回 404 时静默
        try {
            const errUrl = String(error?.config?.url || '')
            if (error?.response?.status === 404 && errUrl.includes('/api/sso/user/info')) {
                return Promise.reject(error)
            }
        } catch {
            // ignore
        }

        // 特殊处理：风险信号管理页面接口偶发 500，不弹出提示
        // 覆盖接口：/api/riskSignal/baseInfo | /api/riskSignal/pageQuery
        try {
            const errUrl = String(error?.config?.url || '')
            if (error?.response?.status === 500 && errUrl.includes('/api/riskSignal/')) {
                return Promise.reject(error)
            }
        } catch {
            // ignore
        }
        
        // 处理token过期或无效的情况（排除 AI 分析服务：其 401 多为 API Key 问题）
        const errUrl = String(error.config?.url || '')
        const isAiAnalysisRequest = errUrl.includes('aiAnalysis')
        if (
            error.response &&
            (error.response.status === 401 || error.response.status === 403) &&
            !isAiAnalysisRequest
        ) {
            ElMessage({
                message: 'Token已过期，请重新登录',
                type: 'error',
                duration: 3 * 1000
            })
            // 清除无效的token
            removeToken()
            // 可以在这里跳转到登录页
            // router.push('/login')
        } else {
            ElMessage({
                message: error.message,
                type: 'error',
                duration: 3 * 1000
            })
        }
        return Promise.reject(error)
    }
)

export default service

/*
===========================
下面是“当前新版 request.js”代码备份（按你的要求：不删除，仅注释保留）
===========================

（此处保留了之前实现的 token 多来源读取、AxiosHeaders、默认头同步、401 防抖等逻辑）
*/ 