// axios二次封装
import axios from "axios"; // 引入 axios
// import baseUrl from "./env"; // 基础url
import Vue from "vue";
import code from "./state_code"; // 状态码维护
import store from "@/store";
let that = new Vue();
const service = axios.create({
  validateStatus(status) {
    return status >= 200 && status <= 504; // 合法状态码
  },
  baseURL: process.env.VUE_APP_API, // 基础请求路径
  timeout: 60000, // 请求超时
});
// 重复尝试此时
service.defaults.retry = 3;
// 重试延时
service.defaults.retryDelay = 15000;
// 开启重试
service.defaults.shouldRetry = true;
// 请求拦截
service.interceptors.request.use(
  (config) => {
    config.headers["Content-Type"] = "application/json;charset=UTF-8";
    config.headers["Accept-Language"] = "zh-CN";
    // token
    config.headers["Authorization"] = store.state.common.token;
    if (config.method === "post") {
      if (!config.data) {
        config.data = {};
      }
    }
    store.commit("common/loadingShow", true);
    return config;
  },
  (error) => {
    const {
      response: { status, statusText },
    } = error;
    that.$msg.error({
      message: status,
      description: statusText || "错误",
    });
  }
);
// response 拦截器
service.interceptors.response.use(
  (response) => {
    that.$msg.destroy(); //防止弹窗多次
    store.commit("common/loadingShow", false);
    return new Promise((resolve, reject) => {
      if (response.status !== 200) {
        // 请求失败
        reject(response);
      } else {
        const { returnCode, returnMsg } = response.data || {};
        // 判断token有效
        const TOKENSTATE = code.TOKEN_INVLIDE_TO_LOGIN(returnCode);
        // 全局错误拦截
        const PUBSTATE = code.PUB_ERR(returnCode, returnMsg, response.config);
        // 请求成功，但逻辑或者业务有错，返回具体数据，根据业务决定是否要提示 有token失效全局异常不返回
        if (TOKENSTATE && PUBSTATE) {
          const { config } = response
          if (config && config.responseType === 'blob') {
            resolve(response)
          }else{
            resolve(response.data);
          }
        }
      }
    }).catch(() => {
      console.log("that?", response);
      that.$msg.error({
        message: response.config.url,
        description: response.status + " : " + response.statusText,
      });
    });
  },
  (err) => {
    store.commit("common/loadingShow", false);
    // 失败
    let message = "请求异常,请检测网络!";
    if (err.response) {
      message = err.response.data.message;
    }
    that.$msg.error({
      message: message,
      description: "错误",
    });
  }
);

export default service;
