import axios from 'axios'
import { Toast } from 'antd-mobile'
import { apiUrl } from './http'
import { domShowFu } from './domShow'

// 处理  类型“AxiosResponse<any, any>”上不存在属性“code”
declare module 'axios' {
  interface AxiosResponse {
    code: number
    // 这里追加你的参数
  }
}

// 创建 axios 实例
const http = axios.create({
  baseURL: apiUrl,
  timeout: 10000
})

let axajInd = 0

// 请求拦截器
http.interceptors.request.use(
  function (config: any) {
    // 发请求前打开加载提示
    domShowFu('#AsyncSpinLoding', true)

    axajInd++
    return config
  },
  function (err) {
    return Promise.reject(err)
  }
)

let timeId = -1

// 响应拦截器
http.interceptors.response.use(
  function (response) {
    // 请求回来的关闭加载提示
    axajInd--
    if (axajInd === 0) {
      domShowFu('#AsyncSpinLoding', false)
    }
    if (response.data.code !== 0 && response.data.msg) {
      Toast.show({
        icon: 'fail',
        content: response.data.msg
      })
    }
    return response.data
  },
  async function (err) {
    clearTimeout(timeId)
    timeId = window.setTimeout(() => {
      axajInd = 0
      domShowFu('#AsyncSpinLoding', false)
      // 如果因为网络原因，response没有，给提示消息
      if (!err.response) {
        Toast.show({
          icon: 'fail',
          content: '网络繁忙，请稍后重试!'
        })
      } else {
        Toast.show({
          icon: 'fail',
          content: '响应错误，请联系管理员!'
        })
      }
    }, 100)

    return Promise.reject(err)
  }
)

// 导出 axios 实例
export default http
