// =============================================================================
// 企微IT智能服务台 — 坐席工作台 Axios 实例与拦截器
// =============================================================================
// 说明：创建 Axios 实例，配置：
//   1. 请求基础 URL
//   2. 请求拦截器（添加认证头等）
//   3. 响应拦截器（统一错误处理）
// =============================================================================

import axios from 'axios'
import type { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from 'axios'
// ElementPlus 消息提示
import { ElMessage } from 'element-plus'

// --------------------------------------------------------------------------
// 创建 Axios 实例
// --------------------------------------------------------------------------
const apiClient: AxiosInstance = axios.create({
  // 基础 URL：所有请求会自动加上这个前缀
  // 开发环境通过 Vite proxy 转发到后端
  baseURL: '/api',
  // 请求超时时间（20秒，原10秒）
  // 原因：图片/文件上传、AI消息处理等场景后端处理需要更多时间
  // 修复截图发送超时Bug
  timeout: 20000,
  // 默认请求头
  headers: {
    'Content-Type': 'application/json',
  },
})

// --------------------------------------------------------------------------
// 请求拦截器
// --------------------------------------------------------------------------
// 在每个请求发送前执行，用于添加认证信息等
apiClient.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 从 localStorage 获取坐席 token，添加到请求头
    const token = localStorage.getItem('agent_token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  (error) => {
    // 请求配置错误时直接返回
    return Promise.reject(error)
  }
)

// --------------------------------------------------------------------------
// 响应拦截器
// --------------------------------------------------------------------------
// 在每个响应返回后执行，用于统一处理错误
apiClient.interceptors.response.use(
  (response: AxiosResponse) => {
    // 从响应中提取业务数据
    const res = response.data

    // 统一响应格式：{code: 0, data: {}, message: "success"}
    // code === 0 表示业务成功
    if (res.code !== 0) {
      // 业务错误：显示错误消息
      ElMessage.error(res.message || '请求失败')

      // 特殊错误码处理
      if (res.code === 1002) {
        // 未授权：跳转到登录页
        // 动态导入避免循环依赖
        import('@/router').then(router => {
          router.default.push('/login')
        })
      }

      // 返回 rejected Promise，让调用方的 catch 能捕获
      return Promise.reject(new Error(res.message || '请求失败'))
    }

    // 业务成功：返回完整响应（调用方从 response.data.data 获取业务数据）
    return response
  },
  (error) => {
    // 网络错误或服务器错误（HTTP 状态码非 2xx）
    let message = '网络异常，请稍后重试'

    if (error.response) {
      // 服务器返回了错误状态码
      switch (error.response.status) {
        case 401:
          message = '未授权，请重新登录'
          break
        case 403:
          message = '拒绝访问'
          break
        case 404:
          message = '请求的资源不存在'
          break
        case 500:
          message = '服务器内部错误'
          break
        default:
          message = `请求失败 (${error.response.status})`
      }
    } else if (error.code === 'ECONNABORTED') {
      // 请求超时
      message = '请求超时，请稍后重试'
    }

    // 显示错误提示
    ElMessage.error(message)

    return Promise.reject(error)
  }
)

// 导出 Axios 实例，供 API 模块使用
export default apiClient
