import axios from 'axios'
import { ElMessage } from 'element-plus'
import useUserStore from '@/store/modules/user'

// 错误码枚举
enum responseCode {
  success = 200, // 成功
  error = 500, // 服务器异常
}

const request = axios.create({
  baseURL: window.localStorage.getItem('IntegratedFront') as string,
  timeout: 1000 * 60,
  responseType: 'json',
})

request.interceptors.request.use(
  (request) => {
    const userStore = useUserStore()
    /**
     * 全局拦截请求发送前提交的参数
     * 以下代码为示例，在请求头里带上 token 信息
     */
    if (userStore.isLogin && request.headers) {
      request.headers.token = userStore.token
    }
    // 是否将 POST 请求参数进行字符串化处理
    return request
  },
)

request.interceptors.response.use(
  (response) => {
    /**
     * 全局拦截请求发送后返回的数据，如果数据有报错则在这做全局的错误提示
     * 如果是文件直接返回整个response对象
     */
    if (response.data instanceof Blob) {
      return Promise.resolve(response)
    }
    else if (response.data.code !== responseCode.success) {
      // 这里做错误提示
      ElMessage.error(response.data.message || '发生错误')
      return Promise.reject(response.data)
    }
    else { // 成功
      return Promise.resolve(response.data)
    }
  },
  (error) => {
    // 处理文件下载的错误提示
    if (error.response && error.response.data instanceof Blob) {
      const reader = new FileReader()
      reader.onload = (e) => {
        let errMsg = '发生错误！'
        if (e && e.target!.result) {
          errMsg = JSON.parse(e.target!.result as string)
        }
        ElMessage.error(errMsg)
      }
    }
    else if (error.response && error.response.data) {
      const message: string = error.response.data.message
      ElMessage({
        message,
        type: 'error',
      })
    }
    else if (error.message) {
      if (error.config.url === '/api/frame/frame_image') {
        return
      }
      let message = error.message
      if (message === 'Network Error') {
        message = '网络故障'
      }
      else if (message.includes('timeout')) {
        message = '接口请求超时'
      }
      else if (message.includes('Request failed with status code')) {
        message = `接口${message.substr(message.length - 3)}异常`
      }
      ElMessage({
        message,
        type: 'error',
      })
    }

    return Promise.reject(error)
  },
)

export default request
