import { getToken } from '@/utils'
import { isMobile } from '@genting/hooks'
import { notification, Space } from 'antd'
import type { RequestConfig } from 'umi'
import VConsole from 'vconsole'
import { API_HOST, isDev } from './constants'

if (isDev && isMobile()) {
  new VConsole()
}

export const qiankun = {
  // 应用加载之前
  async bootstrap(props?: Record<string, any>) {
    console.log('app1 bootstrap', props)
  },
  // 应用 render 之前触发
  async mount(props: Record<string, any>) {
    console.log('app1 mount')
  },
  // 应用卸载之后触发
  async unmount(props: Record<string, any>) {
    console.log('app1 unmount', props)
  },
}

const codeMessage: Record<number, string> = {
  200: '服务器成功返回请求的数据',
  201: '新建或修改数据成功',
  202: '一个请求已经进入后台排队（异步任务）',
  204: '删除数据成功',
  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作',
  401: '用户没有权限（令牌、用户名、密码错误）',
  403: '用户得到授权，但是访问是被禁止的',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作',
  405: '请求方法不被允许',
  406: '请求的格式不可得',
  410: '请求的资源被永久删除，且不会再得到的',
  422: '当创建一个对象时，发生一个验证错误',
  500: '服务器发生错误，请检查服务器',
  502: '网关错误',
  503: '服务不可用，服务器暂时过载或维护',
  504: '网关超时',
}

export const request: RequestConfig = {
  timeout: 5 * 60 * 1000,
  prefix: API_HOST,
  errorHandler: async (error) => {
    let { response, request } = error,
      message = codeMessage[response?.status] || '未知错误'

    if (response && response.status) {
      const contentType = response?.headers.get('Content-Type'),
        isJson = contentType?.includes('json')

      const data = await response[
        isJson ? 'json' : request.options.responseType || 'text'
      ]()

      message = data.message || message

      notification.error({
        message: `请求错误 ${response.status}`,
        description: (
          <Space
            direction="vertical"
            style={{ width: '100%', wordBreak: 'break-all' }}
            size={1}
          >
            <div>{message}</div>
            <div>地址：{request.url}</div>
          </Space>
        ),
      })
    } else {
      notification.error({
        message: '网络异常',
        description: (
          <Space
            direction="vertical"
            style={{ width: '100%', wordBreak: 'break-all' }}
            size={1}
          >
            <div>您的网络发生异常，无法连接服务器</div>
            <div>地址：{request.url}</div>
          </Space>
        ),
      })
    }

    throw new Error(message)
  },
  middlewares: [
    (ctx: any, next: any) => {
      const token = getToken()
      if (token) {
        ctx.req.options.headers = ctx.req.options.headers || {}

        ctx.req.options.headers.token = token
      }

      return next()
    },
  ],
}
