import axios from 'axios'
import { message } from 'ant-design-vue'
import { useUserStore } from '@/stores/user'

const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL, // 从环境变量读取接口地址
  timeout: 1000 * 30,
  headers: {
    'Content-Type': 'application/json',
    Accept: 'application/json',
  },
  withCredentials: true, // 允许跨域携带cookie
})

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    const userStore = useUserStore()
    if (config.url === '/user/login') {
      return config
    }
    if (userStore.userInfo.tokenValue) {
      // token存在就携带token
      config.headers[userStore.userInfo.tokenName] = `${userStore.userInfo.tokenValue}`
    } else {
      userStore.logout()
      return Promise.reject(new Error('未授权，请先登录'))
    }

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

    return config
  },
  (error) => {
    console.error('请求错误：', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    const userStore = useUserStore()
    // HTTP状态码为2xx
    console.log('✅ 请求成功 🚀', response)
    const { data } = response

    // 业务状态码处理
    if ([200, '200'].includes(data.code)) {
      return data
    } else {
      // token过期
      if (['11011', '11012', '11016'].includes(data.code)) {
        if (!userStore.userInfo.tokenValue) return
        message.error('登录失效，请重新登录')
        userStore.logout()
        return
      }
      if (['60001'].includes(data.code)) {
        // 房间信息不存在，不用报错提示
        return
      }
      if ([500, '500'].includes(data.code)) {
        message.error(data.message || data.msg || '服务异常，请联系管理员')
        return
      }
      message.error(data.message || data.msg) // 全局错误信息
      return Promise.reject(new Error(data.message))
    }
  },
  (error) => {
    const userStore = useUserStore()
    // HTTP状态码非2xx
    if (error.response) {
      // 服务器有响应的情况
      const { status, data } = error.response
      console.error('❌ 服务器错误 🚀', status, data, error.config.url)
      const errorMessage = data?.message || data?.msg || `服务异常，请联系管理员`
      if (status === 400 && data?.code === '11016') {
        message.error('登录失效，请重新登录')
        userStore.logout()
        return
      }
      message.error(errorMessage)
      return Promise.reject(new Error(errorMessage))
    } else if (error.request) {
      // 请求已发出但没有收到响应
      console.error('❌ 网络错误 🚀', error.message)
      message.error('网络异常，请检查网络')
      return Promise.reject(new Error('网络异常，请检查网络'))
    } else {
      // 请求配置错误
      console.error('❌ 请求错误 🚀', error.message)
      message.error(`${error.message || '请求异常，请联系管理员'}`)
      return Promise.reject(error)
    }
  }
)

export default service
