/**
 * Axios 请求封装
 * - 请求拦截器：自动携带 JWT Token
 * - 响应拦截器：
 *   1. 剥离后端 { code, data, message } 外壳，直接返回 data
 *   2. 统一捕获业务异常并 ElMessage 弹出
 *   3. 401 自动清 Token 跳登录页
 */

import axios, { type AxiosResponse, type InternalAxiosRequestConfig } from 'axios'
import { ElMessage } from 'element-plus'
import { useUserStore } from '@/store/user'
import router from '@/router'

// 后端统一响应结构
interface ApiResponse<T = any> {
    code: number
    data: T
    message: string
}

const request = axios.create({
    baseURL: import.meta.env.VITE_API_BASE_URL as string,
    timeout: 15000,
    headers: {
        'Content-Type': 'application/json',
    },
})

// ---- 请求拦截器：自动注入 Authorization 头 ----
request.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        const userStore = useUserStore()
        if (userStore.token) {
            config.headers.Authorization = `Bearer ${userStore.token}`
        }
        return config
    },
    (error) => {
        return Promise.reject(error)
    },
)

// ---- 响应拦截器：统一剥离外壳 + 错误处理 ----
request.interceptors.response.use(
    (response: AxiosResponse<ApiResponse>) => {
        const res = response.data

        // 后端返回 code !== 200 视为业务异常
        if (res.code && res.code !== 200) {
            ElMessage.error(res.message || '请求失败')

            // 401 → 清 Token 跳登录
            if (res.code === 401) {
                const userStore = useUserStore()
                userStore.logout()
                router.push('/login')
            }

            return Promise.reject(new Error(res.message || '请求失败'))
        }

        // 成功：直接返回 data（剥离外壳）
        return res.data
    },
    (error) => {
        const status = error.response?.status
        const res = error.response?.data as ApiResponse | undefined
        const message = res?.message || error.response?.data?.detail || '服务器内部错误'

        switch (status) {
            case 401:
                ElMessage.error('登录已过期，请重新登录')
                {
                    const userStore = useUserStore()
                    userStore.logout()
                    router.push('/login')
                }
                break

            case 403:
                ElMessage.warning(message || '权限不足，无法执行此操作')
                break

            case 422:
                ElMessage.warning(`参数错误：${message}`)
                break

            case 500:
                ElMessage.error(`服务器错误：${message}`)
                break

            default:
                ElMessage.error(message || '网络连接异常')
        }

        return Promise.reject(error)
    },
)

export default request
