import axios from "axios";
import { loadProgressBar } from "axios-progress-bar";
import { notifyInvalidTokenThrottled } from "./axiosNotice";
import axiosRetry from "axios-retry";
import { message } from "ant-design-vue";
import { store } from "@/store/store";

const config = {
  // baseURL: process.env.baseURL || process.env.apiUrl || ""
  timeout: 1 * 60 * 1000, // Timeout
  withCredentials: true, // Check cross-site Access-Control
};

const _axiosApp = axios.create(config);
axiosRetry(_axiosApp);

_axiosApp.interceptors.request.use(
  function (config) {
    if (config.setGlobalMask) {
      store.globalMask = true;
    }
    return config;
  },
  function (error) {
    if (error.config.setGlobalMask) {
      store.globalMask = false;
    }
    void message.error({ content: error, duration: 10 });
    console.log(error);
    return Promise.reject(error);
  }
);

// Add a response interceptor
_axiosApp.interceptors.response.use(
  (response) => {
    if (response.config.setGlobalMask) {
      store.globalMask = false;
    }
    return response;
  },
  (error) => {
    if (error.config?.setGlobalMask) {
      store.globalMask = false;
    }
    const showErrorMessage = !error.config?.noErrorMessage;
    if (!error.response) {
      if (showErrorMessage) {
        // "Network Error" 网络不通，直接返回
        void message.error({
          content: "网络连接异常，请检查网络设置。",
          duration: 10,
        });
      }
      return Promise.reject(error);
    }
    // 这里是返回状态码不为200时候的错误处理
    const status = error.response.status;

    // 登录失效 跳转登录页面
    if (status == 403 || status == 401) {
      notifyInvalidTokenThrottled();
      return Promise.reject(error);
    } else if (status == 405) {
      if (showErrorMessage) {
        void message.error({ content: "没有权限！", duration: 10 });
      }
      return Promise.reject(error);
    } else if (status == 502) {
      if (showErrorMessage) {
        void message.error({ content: "服务器异常(502)！", duration: 10 });
      }
      return Promise.reject(error);
    }

    if (status != 200) {
      const data = error.response.data;
      if (data && data.message) {
        if (showErrorMessage) {
          void message.error({ content: data.message, duration: 10 });
        }
      } else {
        if (showErrorMessage) {
          void message.error({
            content: "未定义异常: " + JSON.stringify(data, null, 2),
            duration: 10,
          });
        }
      }
      return Promise.reject(error);
    }
  }
);

// eslint-disable-next-line
loadProgressBar(null, _axiosApp);

export const httpApp = _axiosApp;
