import axios from "axios";
import Router from "@/router";
import { Message, Notification } from "@arco-design/web-vue";
import { useSystemStore } from "@/store/modules/systemStore";

import { fn_logout } from "@/utils";

const axiosInstance = axios.create({
  // baseURL: `${import.meta.env.PROD ? import.meta.env.VITE_PRO_PATH : ''}/api`,
  baseURL: import.meta.env.BASE_URL + "api",
  timeout: 300000,
});

const requestState = {
  // 得到正确响应
  success: [200],
  // token 跳转
  beOverdue: [886],
  // 没有访问权限
  NotAccessRight: [500],
  // 异常code
  exception: [400],
};

const pathArr = ["/api/admin/system/login", "/api/logout"];
axiosInstance.interceptors.request.use(
  (config) => {
    const systemStore = useSystemStore();
    systemStore.localLoading(true);

    // 在发送请求之前做些什么
    if (!pathArr.includes(config.url)) {
      const token = localStorage.getItem("token");
      if (token && config.headers) {
        config.headers["Authorization"] = token;
      }
    }
    return config;
  },
  (err) => {
    const systemStore = useSystemStore();
    systemStore.localLoading();
    Promise.reject(err);
  }
);

// 响应拦截器
axiosInstance.interceptors.response.use(
  (res) => {
    const systemStore = useSystemStore();
    systemStore.localLoading();
    const { code, data, message:msg } = res.data;
    // 成功
    if (code === 200) {
      return Promise.resolve(res.data);
    }

    // 服务端错误信息
    if (requestState.NotAccessRight.includes(code)) {
      Notification.warning({
        title: "系统信息",
        content: msg,
      });
      return Promise.reject(msg);
    }

    // 异常code
    if (requestState.exception.includes(code)) {
      Notification.warning({
        title: "系统提示",
        content: msg,
      });
      return Promise.reject(msg);
    }
    
    return Promise.resolve(data);
  },
  (err) => {
    const systemStore = useSystemStore();
    systemStore.localLoading();
    const res = err["response"];
    if (err.code === "ERR_CANCELED") {
      console.log("请求中断");
      return;
    }
    const msg = err.response.data ? err.response.data.message : ""
    Notification.warning({
      title: "系统信息",
      content: msg
    });
    //token失效
    if (requestState.beOverdue.includes(err.status)) {
      fn_logout(Router);
      // 直接终止请求
      return undefined;
    }
    Promise.reject(err);
  }
);

export default axiosInstance;