import { message } from '@/layouts/messageStore';
import type { RequestConfig } from '@umijs/max';
import { getCookie } from './cookie';
import { getOauthTokenInfo } from './loginUtil';
import { clearSession } from './loginUtil/session';
import { getSession } from './session';

export const codeMessage: Record<number, string> = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',
  400: '发出的请求有错误，参数错误。',
  401: '用户没有权限。',
  424: '请求令牌已过期',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '服务器发生错误，请检查服务器。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。',
};
//错误配置
export const errorConfig: RequestConfig['errorConfig'] = {};
//请求拦截器
export const requestInterceptors: RequestConfig['requestInterceptors'] = [
  // 直接写一个 function，作为拦截器
  (url, options) => {
    const headers = {
      Authorization: 'bearer ' + getSession('token'),
      ...options.headers,
    };

    return { url, options: { ...options, headers } };
  },
];

//响应拦截器
export const responseInterceptors: RequestConfig['responseInterceptors'] = [
  // 一个二元组，第一个元素是 request 拦截器，第二个元素是错误处理
  [
    (response) => {
      const { data }: { data: any } = response;
      if (data?.code === 1) {
        message.error(data?.msg || '查询失败');
      }

      if (data?.code === 200) {
        if (data?.data === true) {
          message.success(data?.msg);
        }
        if (data?.data === false) {
          message.error(data?.msg);
        }
      }
      // 不再需要异步处理读取返回体内容，可直接在data中读出，部分字段可在 config 中找到
      return response;
    },
    (error: any) => {
      if (error?.response?.status === 424) {
        //退出登录
        clearSession();
        getOauthTokenInfo('default');
      }
      message.error(
        error?.response?.data?.msg || codeMessage[error?.response?.status],
      );
      return Promise.reject(error);
    },
  ],
];
