import { Message } from '@arco-design/web-vue'
import { isString, throttle } from 'lodash'
// @ts-ignore
import qs from 'qs'
import router from '@/router'
import { removeStore } from './storage'

const show = throttle(
  (msg: string) => {
    Message.error({
      content: isString(msg) ? msg : '系统错误，请联系平台管理员',
      duration: 6 * 1000,
      closable: true
    })
  },
  1000,
  { trailing: false }
)
let oldMsg = ''
let timestamp = new Date().getTime()
const showMessage = (msg: string) => {
  if (oldMsg !== msg) {
    timestamp = new Date().getTime()
    oldMsg = msg
    Message.error({
      content: isString(msg) ? msg : '系统错误，请联系平台管理员',
      duration: 6 * 1000,
      closable: true
    })
    return
  }
  const now = new Date().getTime()
  if (now - timestamp > 1000) {
    show(msg)
  }
}

export default (error: any) => {
  // eslint-disable-next-line no-console
  console.log('=======[Axios Error res]', error)
  let msg
  if (error.status || error.response) {
    const { status, data, statusText, config } = error.status ? error : error.response
    if (data && (data.code === -1 || data.code > 0)) {
      msg = data.msg ? data.msg : data.data
    } else {
      msg = data || statusText
    }
    if (status === 401 || msg === '请先登录' || msg === '请先登陆') {
      msg = '登录过期,请重新登陆'
      removeStore('token')
      if (window.location.pathname !== '/') {
        const path = qs.stringify({
          ...router.currentRoute.value.query,
          redirect: undefined
        })
        router.push(`/login?redirect=${window.location.pathname}${encodeURIComponent(`?${path}`)}`)
      } else {
        router.push('/login')
      }
    } else if (status === 404) {
      msg = '接口地址错误，请通过右上角的反馈入口提交错误信息'
    } else if (status === 500 && msg === 'Internal Server Error') {
      msg = '服务器维护中，请十分钟后再试'
    } else if (status === 502) {
      msg = '服务器维护中，请十分钟后再试'
    }
    if (config.headers && config.headers.toast !== false && config.headers.toast !== 'false') {
      showMessage(msg)
    }
    return Promise.reject(msg)
  }
  if (error && error.message.indexOf('timeout of 20000ms exceeded') >= 0) {
    msg = '网络连接失败，请稍后重试'
    Message.error({
      content: msg,
      closable: true
    })
  } else {
    msg = `请求失败:${error.message}`
    Message.error({
      content: msg,
      duration: 0,
      closable: true
    })
  }
  return Promise.reject(msg)
}
