import type { RequestOptions } from '@@/plugin-request/request';
import type { RequestConfig } from '@umijs/max';
import { request } from '@umijs/max';
import { message } from 'antd';
import { getAccessToken, getRefreshToken, setToken } from './utils/auth';

// const tenantEnable = process.env.VITE_APP_TENANT_ENABLE;
// const { result_code, base_url, request_timeout } = config;
// 错误处理方案： 错误类型
// enum ErrorShowType {
//   SILENT = 0,
//   WARN_MESSAGE = 1,
//   ERROR_MESSAGE = 2,
//   NOTIFICATION = 3,
//   REDIRECT = 9,
// }
// 与后端约定的响应数据格式
interface ResponseStructure {
  success: boolean;
  data: any;
  code?: number;
  msg?: string;
}

// const ignoreMsgs = [
//   "无效的刷新令牌", // 刷新令牌被删除时，不用提示
//   "刷新令牌已过期", // 使用刷新令牌，刷新获取新的访问令牌时，结果因为过期失败，此时需要忽略。否则，会导致继续 401，无法跳转到登出界面
// ];

// const errorCode: { [key: string]: string } = {
//   "400": "请求参数不正确",
//   "401": "账号未登录",
//   "403": "当前操作没有权限",
//   "404": "访问资源不存在",
//   "405": "请求方法不正确",
//   "423": "请求失败，请稍后重试",
//   "429": "请求失败，请稍后重试",
//   "500": "系统异常",
//   "501": "功能未实现/未开启",
//   "502": "错误的配置项",
//   "900": "重复请求，请稍后重试",
//   default: "系统未知错误，请反馈给管理员",
// };

/**
 * @name 错误处理
 * pro 自带的错误处理， 可以在这里做自己的改动
 * @doc https://umijs.org/docs/max/request#配置
 */

const refreshToken = async () => {
  return await request('/system/auth/refresh-token', {
    method: 'POST',
    params: { refreshToken: getRefreshToken() },
  });
};

const handleAuthorized = () => {
  // const { t } = useI18n()
  // if (!isRelogin.show) {
  //   // 如果已经到登录页面则不进行弹窗提示
  //   if (window.location.href.includes('login')) {
  //     return
  //   }
  //   isRelogin.show = true
  //   ElMessageBox.confirm(t('sys.api.timeoutMessage'), t('common.confirmTitle'), {
  //     showCancelButton: false,
  //     closeOnClickModal: false,
  //     showClose: false,
  //     closeOnPressEscape: false,
  //     confirmButtonText: t('login.relogin'),
  //     type: 'warning'
  //   }).then(() => {
  //     resetRouter() // 重置静态路由表
  //     deleteUserCache() // 删除用户缓存
  //     removeToken()
  //     isRelogin.show = false
  //     // 干掉token后再走一次路由让它过router.beforeEach的校验
  //     window.location.href = window.location.href
  //   })
  // }
  // return Promise.reject(t('sys.api.timeoutMessage'))
};
// 是否正在刷新中
let isRefreshToken = false;
// 请求队列
const requestList: any[] = [];
export const errorConfig: RequestConfig = {
  // 错误处理： umi@3 的错误处理方案。
  errorConfig: {
    // 错误抛出
    errorThrower: (res) => {
      const { success, data, code, msg } = res as unknown as ResponseStructure;
      if (!success) {
        const error: any = new Error(msg);
        error.name = 'BizError';
        error.info = { code, msg, data };
        throw error; // 抛出自制的错误
      }
    },
    // 错误接收及处理
    errorHandler: async (error: any, opts: any) => {
      const errorInfo: ResponseStructure | undefined = error.info;
      if (error.name === 'BizError') {
        if (errorInfo) {
          const { msg } = errorInfo;
          message.error(msg);
        }
      } else if (error.response) {
        // Axios 的错误
        // 请求成功发出且服务器也响应了状态码，但状态代码超出了 2xx 的范围
        message.error(`Response status:${error.response.status}`);
      } else if (error.request) {
        message.error('None response! Please retry.');
      } else {
        message.error(`发送请求时出了点问题:${error.msg}`);
      }
      throw error;
    },
  },

  // 请求拦截器
  requestInterceptors: [
    (config: RequestOptions) => {
      // 拦截请求配置，进行个性化处理。
      console.log('requestInterceptors', config);
      return { ...config };
    },
  ],

  // 响应拦截器
  responseInterceptors: [
    async (response) => {
      const { data } = response as unknown as ResponseStructure;
      const config = response.config;
      const { code } = data;

      if (!data) {
        // 返回“[HTTP]请求没有返回值”;
        throw new Error();
      }

      if (
        response.request.responseType === 'blob' ||
        response.request.responseType === 'arraybuffer'
      ) {
        return response;
        // data = await new Response(data).json();
      }
      // 获取错误信息
      // const msg = data.msg || errorCode[code] || errorCode["default"];
      // if (ignoreMsgs.indexOf(msg) !== -1) {
      //   // 如果是忽略的错误码，直接返回 msg 异常
      //   return Promise.reject(msg);
      // }
      if (!config.url) {
        throw new Error('请求URL不能为空');
      }
      // 发送请求时出了点问题
      if (code === 401) {
        if (!isRefreshToken) {
          isRefreshToken = true;
          // 1. 如果获取不到刷新令牌，则只能执行登出操作
          if (!getRefreshToken()) {
            return handleAuthorized();
          }
          // 2. 进行刷新访问令牌
          try {
            const refreshTokenRes = await refreshToken();
            setToken(refreshTokenRes);
            location.reload();
          } catch (_) {
            return handleAuthorized();
          } finally {
            isRefreshToken = false;
          }
          return request(config.url, config);
        } else {
          console.log('刷新令牌失败');
          //添加到队列，等待刷新获取到新的令牌
          return new Promise((resolve) => {
            requestList.push(() => {
              if (!config.url) {
                throw new Error('请求URL不能为空');
              }
              if (config.headers)
                config.headers.Authorization = `Bearer ${getAccessToken()}`; // 让每个请求携带自定义token 请根据实际情况自行修改
              resolve(request(config.url, config));
            });
          });
        }
      }
      if (data.code !== 0) {
        return Promise.reject(data);
      }
      if (data?.success === false) {
        message.error('请求失败！');
        return Promise.reject(data);
      }

      return data;
    },
  ],
};
