import { extend } from 'umi-request'
import cleanDeep from 'clean-deep'
import { browser, openLoading, closeLoading } from '@/helpers/utils'
import { setLogout, setLoginError } from '@/state'
import { postMessage } from './native-message'
import { Toast } from 'vant'

export interface SearchInitParams {
  rows?: string | number
  page?: string | number
}

const request = extend({
  // requestType: 'form',
  timeout: 20000,
  timeoutMessage: '请求超时'
})

// request.use(async (ctx, next) => {
//   const { url, options } = ctx.req
//   const prefix = options.prefix || '';
//   const baseUrl: string = url.replace(prefix, '') || '';
//   const linkUrl: string = (ApiRouter as any)[baseUrl];
//   if (linkUrl) {
//     ctx.req.url = prefix + linkUrl;
//   }
//   await next();
// })

// 是否是初始化接口
let initRequest = false
let toast: ReturnType<typeof setTimeout>

request.interceptors.request.use(
  (url, options: any) => {
    // openLoading();
    if (!options.hideLoading) {
      clearTimeout(toast)
      Toast.loading({
        message: '加载中...',
        forbidClick: true,
        loadingType: 'spinner',
        duration: 0
      })
    }

    initRequest = options.initRequest || false
    const Authorization = sessionStorage.getItem('Authorization') || ''
    const authHeaders: any = {}
    if (
      Authorization &&
      ![
        '/api-auth/usernameLogin',
        '/api-auth/smsLogin',
        '/api-auth/code/sendSms'
      ].includes(url)
    ) {
      authHeaders.Authorization = Authorization
    }
    return {
      url,
      options: {
        ...options,
        params: cleanDeep(options.params),
        headers: {
          ...options.headers,
          ...authHeaders
        }
      }
    }
  },
  { global: false }
)

request.interceptors.response.use(
  async res => {
    toast = setTimeout(() => {
      Toast.clear()
    }, 100)

    if (res.status > 299 || res.status < 200) {
      clearTimeout(toast)
      const msg = '服务器错误，状态码' + res.status
      Toast(msg)
      throw new Error(msg)
    }
    const data = await res.clone().json()
    if (data.code !== 200 && data.errCode !== 0) {
      let msg = data.msg || data.message || '处理失败，请重试'
      if (initRequest) {
        if (data.code === 403 || data.code === 401) {
          setLogout()
        } else {
          setLoginError()
        }
      }
      if (!(data.code === 403 || data.code === 401)) {
        clearTimeout(toast)
        Toast(msg)
      }
      const browserInfo = browser()
      if (data.code === 403) {
        msg += '403'
        if (browserInfo.isApp) {
          postMessage({
            api: 'login'
          })
        } else {
          setLogout()
        }
      }
      throw new Error(msg)
    }
    return res
  },
  { global: false }
)

export default request
