// src/utils/request.ts
import axios from 'axios'
import { ElMessage } from 'element-plus'
import type { AxiosInstance, AxiosResponse ,InternalAxiosRequestConfig} from 'axios'

// 创建 axios 实例
const service: AxiosInstance = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || '', // 从环境变量中读取
  timeout: 10000, // 超时时间
  withCredentials: true // 是否允许携带 cookie
})

// 请求拦截器
service.interceptors.request.use(
  (config:InternalAxiosRequestConfig) => {
    // 可在此添加 token 到 headers 中
    const token = localStorage.getItem('token')
    if (token) {
      config.headers!['Authorization'] = `${token}`
    }
    return config
  },
  (error) => { 
    // 请求错误处理
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器 添加泛型 <ApiResponse>，明确拦截器返回的是业务数据结构而非原始 AxiosResponse
service.interceptors.response.use(
  (response: AxiosResponse) => {
    const res = response.data

    // if (res.code !== 200) {
    //   ElMessage({
    //     message: res.msg || '请求失败',
    //     type: 'error',
    //     duration: 5 * 1000
    //   })

      // 特殊状态码处理，如 token 失效等
      if (response.config.responseType == "blob") {
        return response;
      }else if (res.code === 401) {
        // 跳转登录页
        window.location.href = '/'
      }else
      {
        return res
      }

    //   return Promise.reject(res.msg || '请求失败')
    // }
    //这里直接返回 res (即 ApiResponse 对象)，而不是 response
    // 这样在组件中接收到的就是 { code, msg, data }
    // return res 
  },
  (error) => {
    // 网络错误、超时等处理
    const message = error.message.includes('timeout') ? '请求超时' : '网络异常'
    ElMessage({
      message,
      type: 'error'
    })
    return Promise.reject(error)
  }
)

export default service
