import axios from 'axios'
import { ElMessage } from 'element-plus'
//  让请求在浏览器中允许跨域携带cookie
import Cookie from 'js-cookie'
axios.defaults.withCredentials = true
// axios.defaults.baseURL = import.meta.env.MODE === 'development' ? '/pm' : ''
axios.defaults.baseURL = '/pm'
// 使用自定义配置新建一个 axios 实例
const http = axios.create()
// 正在进行中的请求列表
const reqList = []
/**
 * 阻止重复请求
 * @param {array} reqList - 请求缓存列表
 * @param {string} url - 当前请求地址
 * @param {function} cancel - 请求中断函数
 * @param {string} errorMessage - 请求中断时需要显示的错误信息
 */
const stopRepeatRequest = function (reqList, url, cancel, errorMessage) {
  const errorMsg = errorMessage || ''
  for (let i = 0; i < reqList.length; i++) {
    if (reqList[i] === url) {
      cancel(errorMsg)
      return
    }
  }
  reqList.push(url)
}
/**
 * 允许某个请求可以继续进行
 * @param {array} reqList 全部请求列表
 * @param {string} url 请求地址
 */
const allowRequest = function (reqList, url) {
  for (let i = 0; i < reqList.length; i++) {
    if (reqList[i] === url) {
      reqList.splice(i, 1)
      break
    }
  }
}

// 请求拦截器，例如请求的时候在头部加上请求的token
http.interceptors.request.use(
  config => {
    let cancel
    // 设置cancelToken对象
    config.cancelToken = new axios.CancelToken(function (c) {
      cancel = c
    })
    // 阻止重复请求。当上个请求未完成时，相同的请求不会进行
    if (config.url === '/auth/info' || config.url === '/api/dict/all') {
      stopRepeatRequest(reqList, config.url, cancel, '请求中断！')
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
http.interceptors.response.use(
  response => {
    // 增加延迟，相同请求不得在短时间内重复发送
    setTimeout(() => {
      allowRequest(reqList, response.config.url)
    }, 1000)
    if (response.status === 200) {
      return Promise.resolve(response.data)
    }
  },
  error => {
    if (!axios.isCancel(error)) {
      setTimeout(() => {
        allowRequest(reqList, error.config.url)
      }, 1000)
    }
    if (error.response) {
      ElMessage.closeAll()
      // 网络超时异常处理
      if (
        error.code === 'ECONNABORTED' ||
        error.message === 'Network Error' ||
        error.message.includes('timeout')
      ) {
        ElMessage({
          type: 'error',
          message: '请求超时，请稍后重试'
        })
        // 服务器状态码不是200的情况,这些自定义（需要与后台商量返回）
      } else if (error.response.status === 401) {
        ElMessage({
          type: 'error',
          message: error.response.data.message || '用户信息过期，请重新登陆'
        })
        // 清除token
        Cookie.remove('token')
        localStorage.clear()
        // 跳转登录
        setTimeout(() => {
          window.location.href = '/login'
        }, 500)
      } else if (error.response.status <= 400 <= 500) {
        ElMessage({
          type: 'error',
          message:
            error.response.data.message ||
            `服务器无法处理请求！(${error.response.status})!`
        })
      } else {
        ElMessage({
          type: 'error',
          message:
            error.response.data.message ||
            `服务器出错(${error.response.status})!`
        })
      }
    }

    return Promise.reject(error)
  }
)

export default http
