/*
 * @Author: jixiang
 * @Date: 2021-04-07 11:06:09
 * @Description:封装axios 请求
 * @FilePath: /vite_pc/src/api/axios.ts
 * 56580223@qq.com
 */
import Axios, { AxiosResponse, AxiosRequestConfig, AxiosError } from 'axios';
import router from '@/router';
import { message } from 'ant-design-vue';
import Store from '@/store';
import qs from 'qs';
import {
  setToken,
  setRefreshToken,
  getToken,
  getTokenKey,
  getRefreshToken,
  getRefreshTokenKey,
  removeToken,
} from '@/utils/cookie';
/**
 * get status code
 * @param {AxiosResponse} response Axios  response object
 */
const getErrorCode2text = (response: AxiosResponse): string => {
  /** http status code */
  const code = response.status;
  /** notice text */
  let message = 'Request Error';
  switch (code) {
    case 400:
      message = 'Request Error';
      break;
    case 401:
      message = '登录信息失效';
      break;
    case 403:
      message = '拒绝访问';
      break;
    case 404:
      message = '访问资源不存在';
      break;
    case 408:
      message = '请求超时';
      break;
    case 500:
      message = '位置错误';
      break;
    case 501:
      message = '承载服务未实现';
      break;
    case 502:
      message = '网关错误';
      break;
    case 503:
      message = '服务暂不可用';
      break;
    case 504:
      message = '网关超时';
      break;
    case 505:
      message = '暂不支持的 HTTP 版本';
      break;
    default:
      message = '位置错误';
  }
  return message;
};

/**
 * @returns  {AxiosResponse} result
 * @tutorial see more:https://github.com/onlyling/some-demo/tree/master/typescript-width-axios
 * @example
 * service.get<{data: string; code: number}>('/test').then(({data}) => { console.log(data.code) })
 */

const service = Axios.create({});

service.defaults.timeout = 10000;
(service.defaults.baseURL = import.meta.env.VITE_APP_BASE_URL as string | undefined),
  // 设置post请求头
  (Axios.defaults.withCredentials = true);
service.defaults.validateStatus = () => true;
service.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8';
service.defaults.paramsSerializer = (params) => qs.stringify(params, { arrayFormat: 'repeat' });
/**
 * @description 请求发起前的拦截器
 * @returns {AxiosRequestConfig} config
 */
service.interceptors.request.use(
  (config) => {
    // 登录流程控制中，根据本地是否存在token判断用户的登录情况
    // 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token
    // 后台根据携带的token判断用户的登录情况，并返回给我们对应的状态码
    // 而后我们可以在响应拦截器中，根据状态码进行一些统一的操作。
    // 判断一下是否有cookie 如果有的话则把cookie放入请求头中
    // 添加token
    const token = getToken();
    token && (config.headers['authorization'] = token);
    return config;
  },
  (error) => {
    (Promise as any).error(error);
  }
);

/**
 * @description 响应收到后的拦截器
 * @returns {}
 */
service.interceptors.response.use(
  /** 请求有响应 */
  async (response: AxiosResponse) => {
    if (response.status === 200) {
      // 登录失效
      if(response.data.code === 401){
        //window.location.href = import.meta.env.VITE_APP_BOOK_STORE_URL as string;
      }
      return Promise.resolve(response);
    } else {
      const __text = getErrorCode2text(response);
      message.error(__text);
      return Promise.reject(new Error(__text));
    }
  },
  /** 请求无响应 */
  (error: AxiosError) => {
    let __emsg: string = error.message || '';

    if (error.message) {
      __emsg = error.message;
    }

    if (error.response) {
      __emsg = error.response.data.message ? error.response.data.message : error.response.data.data;
    }
    // timeout
    if (__emsg.indexOf('timeout') >= 0) {
      __emsg = 'timeout';
    }

    if (error?.response?.status === 401) {
      if (router.currentRoute.value.path !== '/entry/login') {
        window.location.href = import.meta.env.VITE_APP_BOOK_STORE_URL as string;
        // message.info('登录凭证已过期，请重新登录');
        // router.push('/entry/login');
      }
      return Promise.reject(new Error('401'));
    }
    return Promise.reject(new Error("系统正在升级中，请稍后访问！"));
  }
);

export default service;
