import Request from 'luch-request';
import store from '@/store';
import { AxiosInstance } from 'axios';
//import { session } from '@/store/modules/session';
import vm from '@/main';

/**
 * 标识调试状态
 */
const debug = process.env.NODE_ENV !== 'production';

const httpjson = new Request({
  baseURL: process.env.VUE_APP_BASE_URL,
});

/**
 * 标识加载中状态
 */
let loading: any;

httpjson.interceptors.request.use(
  (config: any) => {
    // 所有请求默认提示加载中
    if (!loading) {
      uni.showLoading({ title: vm.$t('message.Loading') as string });
    } else {
      clearTimeout(loading);
    }
    // 在请求发送之前做一些处理
    try {
      const token = ''; // store.state.session.accessToken;
      if (token) {
        // 让每个请求携带token
        config.header['content-type'] = 'application/json';
      }
    } catch (e) {
      // error
    }
    if (typeof config.data === 'string' && config.data.constructor === String) {
      config.header['content-type'] = 'application/json';
    }
    // if (session.lang) {
    //   config.url = config.url + '?lang=' + (session.lang == 'en' ? 'en_US' : 'zh_CN');
    // }
    return config;
  },
  (error: Error) => {
    // 发送失败
    console.log(error);
    Promise.reject(error);
  },
);

httpjson.interceptors.response.use(
  (response: any) => {
    // 延时关闭加载中提示
    loading = setTimeout(() => {
      loading = undefined;
      uni.hideLoading();
    }, 500);
    debug && console.log(response);
    // dataAxios 是 axios 返回数据中的 data
    const dataAxios = response.data;
    // 测试服务接口直接返回结果
    if (response.config.url === '/wmspda/system/test') {
      return dataAxios;
    }
    // 这个状态码是和后端约定的
    const { code, status } = dataAxios;
    // 根据 code 进行判断
    if (code === undefined && status === undefined) {
      // 如果没有 code 代表这不是项目后端开发的接口 比如可能是 D2Admin 请求最新版本
      return dataAxios;
    } else if (code !== undefined) {
      // 有 code 代表这是一个后端接口 可以进行进一步的判断
      switch (code) {
        case '1':
          // code === '1' 代表没有错误
          return dataAxios;
        case 401:
          // [ 示例 ] 其它和后台约定的 code
          store.dispatch('session/logout');
          uni.setStorageSync('showLoginTips', true);
          uni.switchTab({ url: '/pages/personal/index' });
          errorCreate(dataAxios.message, response.config.custom.hideError);
          break;
        default:
          // 不是正确的 code
          errorCreate(dataAxios.msg, response.config.custom.hideError);
          break;
      }
    } else if (status !== undefined) {
      // 有 status 代表这是一个后端接口 可以进行进一步的判断
      switch (status) {
        case 'S':
          // code === 'S' or '1' 代表没有错误
          return dataAxios;
        default:
          // 不是正确的 code
          errorCreate(dataAxios.msg, response.config.custom.hideError);
          break;
      }
    }
  },
  (error: any) => {
    // 延时关闭加载中提示
    loading = setTimeout(() => {
      loading = undefined;
      uni.hideLoading();
    }, 500);
    if (error?.data?.message) {
      error.message = error.data.message;
    } else if (error) {
      switch (error.statusCode) {
        /* eslint-disable */
        case 400:
          error.message = vm.$t("message.request_Tip1") as string;
          break;
        case 401:
          error.message = vm.$t("message.request_Tip2") as string;
          break;
        case 403:
          error.message = vm.$t("message.request_Tip3") as string;
          break;
        case 404:
          error.message =
            (vm.$t("message.request_Tip4") as string) + error.config.url;
          break;
        case 408:
          error.message = vm.$t("message.request_Tip5") as string;
          break;
        case 500:
          error.message = vm.$t("message.request_Tip6") as string;
          break;
        case 501:
          error.message = vm.$t("message.request_Tip7") as string;
          break;
        case 502:
          error.message = vm.$t("message.request_Tip8") as string;
          break;
        case 503:
          error.message = vm.$t("message.request_Tip9") as string;
          break;
        case 504:
          error.message = vm.$t("message.request_Tip10") as string;
          break;
        case 505:
          error.message = vm.$t("message.request_Tip11") as string;
          break;
        default:
          break;
        /* eslint-enable */
      }
    }
    errorLog(error, error?.config?.custom?.hideError);
    return Promise.reject(error);
  },
);

// 创建一个错误
function errorCreate(msg: string, hideError: boolean) {
  const error = new Error(msg);
  errorLog(error, hideError);
  throw error;
}

// 记录和显示错误
function errorLog(error: Error, hideError: boolean) {
  // 打印到控制台
  if (process.env.NODE_ENV === 'development') {
    console.error('>>>>>> Error >>>>>>');
    console.error(error);
  }
  // 显示提示
  hideError ||
    uni.showToast({
      icon: 'none',
      title: error.message,
    });
}

export default httpjson as AxiosInstance;
