import axios from 'axios'
import { getToken, clearAuth } from './auth'

// 创建axios实例
const request = axios.create({
  baseURL: '/api', // 使用代理前缀
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json;charset=UTF-8',
  },
})

// 需要token的接口列表
const TOKEN_REQUIRED_APIS = [
  // '/user/info',
  // '/user/update',
  // '/reservation/create',
  // '/reservation/list',
  // '/reservation/cancel',
  // '/activity/register',
  // '/activity/cancel',
  // '/collection/favorite',
  // '/collection/unfavorite',
]

// 检查是否需要token
function needsToken(url) {
  return TOKEN_REQUIRED_APIS.some((api) => url.includes(api))
}

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 判断是否需要添加token
    if (needsToken(config.url)) {
      const token = getToken()
      if (token) {
        config.headers.Authorization = `Bearer ${token}`
      }
    }

    // 添加时间戳防止缓存
    if (config.method === 'get') {
      config.params = {
        ...config.params,
        _t: Date.now(),
      }
    }

    console.log('请求发送:', config)
    return config
  },
  (error) => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  },
)

// 响应拦截器
request.interceptors.response.use(
  (response) => {
    console.log('响应接收:', response)

    // 统一处理响应数据
    const { data } = response

    // 根据后端返回的数据结构调整
    if (data.code === 200 || data.success === true) {
      return data.data || data
    } else {
      // 处理业务错误
      const errorMsg = data.message || data.msg || '请求失败'
      console.error('业务错误:', errorMsg)

      // 如果是token过期或无效
      if (data.code === 401 || data.code === 403) {
        // 清除认证信息
        clearAuth()

        // 跳转到登录页面或显示登录提示
        // 这里可以根据实际需求处理
        console.warn('登录已过期，请重新登录')
      }

      return Promise.reject(new Error(errorMsg))
    }
  },
  (error) => {
    console.error('响应错误:', error)

    let errorMsg = '网络错误'

    if (error.response) {
      // 服务器返回错误状态码
      const { status, data } = error.response

      switch (status) {
        case 400:
          errorMsg = '请求参数错误'
          break
        case 401:
          errorMsg = '未授权，请登录'
          clearAuth()
          break
        case 403:
          errorMsg = '拒绝访问'
          break
        case 404:
          errorMsg = '请求地址不存在'
          break
        case 500:
          errorMsg = '服务器内部错误'
          break
        default:
          errorMsg = data?.message || data?.msg || `请求失败(${status})`
      }
    } else if (error.request) {
      // 请求发送但没有收到响应
      errorMsg = '网络连接超时'
    }

    return Promise.reject(new Error(errorMsg))
  },
)

export default request
