import axios from "axios";
import useLoginStore from "@/store/user";
import { ElMessage } from "element-plus";
import { ref } from "vue";
// 创建一个 axios 实例
const service = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_API, // 这里设置为代理的路径  /api
  timeout: 5000, // 请求超时时间
});

const reloadCodes = [401, 1011007, 1011008];
const errorCodeMap = {
  400: "发出的请求有错误，服务器没有进行新建或修改数据的操作。",
  401: "用户没有权限（令牌、用户名、密码错误）。",
  403: "用户得到授权，但是访问是被禁止的。",
  404: "发出的请求针对的是不存在的记录，服务器没有进行操作。",
  406: "请求的格式不可得。",
  410: "请求的资源被永久删除，且不会再得到的。",
  422: "当创建一个对象时，发生一个验证错误。",
  500: "服务器发生错误，请检查服务器。",
  502: "网关错误。",
  503: "服务不可用，服务器暂时过载或维护。",
  504: "网关超时。",
};
// 定义一个重新登录弹出窗的变量
const loginBack = ref(false);
service.interceptors.request.use(
  (config) => {
    const store = useLoginStore();
    const token = store.token;
    if (token) {
      config.headers["token"] = ` ${token}`;
    }
    if (!false && config.method === "get") {
      config.params = config.params || {};
      config.params._ = new Date().getTime();
    }
    Object.assign(config.headers, {});
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 保持重新登录
const error = () => {
  loginBack.value = true;
  // 清除所有东西。。。 在发请求
  // window.location.reload();
};

// HTTP response 拦截器
service.interceptors.response.use(
  (response) => {
    // 配置了blob，不处理直接返回文件流
    if (response.config.responseType === "blob") {
      if (response.status === 200) {
        return response;
      } else {
        console.log("文件下载失败或此文件不存在");
        return;
      }
    }
    const data = response.data;
    const code = data.code;
    if (reloadCodes.includes(code)) {
      if (!loginBack.value) {
        error();
      }
      return;
    }
    if (code !== 200) {
      const customErrorMessage = response.config.customErrorMessage;
      ElMessage.error(customErrorMessage || data.msg);
      return Promise.reject(data);
      // 自定义错误提示，覆盖后端返回的message
      // 使用示例：
      // export function customerList (data) {
      //   return request('list', data, 'get', {
      //     customErrorMessage: '自定义错误消息提示'
      //   });
      // }
    } else {
    }
    return Promise.resolve(data);
  },
  (error) => {
    if (error) {
      const status = 503;
      const description = errorCodeMap[status];
      console.log("错误", description);
      return Promise.reject(status);
    }
  }
);

export const baseRequest = (url, value = {}, method = "post", options = {}) => {
  url = import.meta.env.VITE_APP_URL + url;
  // import.meta.env.VITE_APP_URL 后端服务器地址
  if (method === "post") {
    return service.post(url, value, options);
  } else if (method === "postSp") {
    let params = "";
    for (let key in value) {
      params = params + key + "=" + value[key] + "&";
    }
    url = url + "?" + params;
    return service.post(url, {
      params: "",
      ...options,
    });
  } else if (method === "get") {
    return service.get(url, {
      params: value,
      ...options,
    });
  } else if (method === "formdata") {
    return service.post(url, qs.stringify(value), {
      headers: {
        "Content-Type": "multipart/form-data",
      },
      ...options,
    });
  } else {
    // 其他请求方式，例如：put、delete
    return service({
      method: method,
      url: url,
      data: value,
      ...options,
    });
  }
};

// 模块内的请求, 会自动加上模块的前缀
export const moduleRequest =
  (moduleUrl) =>
  (url, ...arg) => {
    return baseRequest(moduleUrl + url, ...arg);
  };

export default service;
