import { message } from 'ant-design-vue'
import axios, { AxiosInstance, AxiosResponse } from 'axios'
import defaultSetting from '../../config/defaultSetting'
import { useModule } from '@/hooks'
import { useUserStore } from '@/store'

export const instance = axios.create({
  baseURL: '',
  timeout: 100000
})

/**
 * 该函数捕获一个错误并返回一个被拒绝的承诺。
 * @param {any} error - `error` 参数是 `any` 类型，这意味着它可以是任何数据类型。它用作 `catchErr` 函数的输入参数。
 * @returns `catchErr` 函数返回一个被拒绝的 Promise，并传递了 `error` 参数作为拒绝的原因。
 */
const catchErr = (response: AxiosResponse) => {
  const { data } = response
  if (data.code === 500) {
    message.error(data.msg)
  } else if (data.code === 400) {
    message.error(data.msg)
  }
}

/**
 * 登录失效后重定向地址
 */
const redirectUrl = () => {
  window.open(defaultSetting.logout + `?redirectUrl=${useModule().path}`)
}

instance.interceptors.request.use(config => {
  config.headers.Authentication = useUserStore().userInfo.token
  return config
}, function (error) {
  return Promise.reject(error)
})

instance.interceptors.response.use(function (response) {
  catchErr(response)

  if (response.status === 403) {
    redirectUrl()
  }
  return response.data
}, error => Promise.reject(error))

export const setBaseUrl = (baseURL: string) => instance.defaults.baseURL = baseURL

export default function request <T> (config: any) {
  return instance.request<AxiosInstance, SERVICE.Response<T>>(config)
}
