import axios from "axios";
import router from "../router.js";
import Vue from "vue";
import { Toast } from "vant";
Vue.use(Toast);
Vue.prototype.$axios = axios

axios.defaults.retry = 3;
axios.defaults.retryDelay = 5000;
function getCookie(cname) {
  let name = cname + "="
  let ca = document.cookie.split(";")
  for(let i=0; i<ca.length; i++) {
    let c = ca[i].trim()
    if(c.indexOf(name)==0) {return c.substring(name.length, c.length)}
  }
  return ""
}

const token = getCookie('token')
// 配置请求信息
const API = axios.create({
  CancelToken: "",
  baseURL: "",
  timeout: "60000", //请求超时时间
  headers: {
    // "X-Requested-With": "XMLHttpRequest",
    // "Content-Type": "multipart/form-XMLHttpRequest"
    // "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    "Content-Type": "application/json; charset=UTF-8",
    "token": token
    // 'Content-Type': 'application/x-www-form-urlencoded'
    //   'X-Requested-With': 'XMLHttpRequest',
    // 'Access-Control-Allow-Origin': 'http://192.168.10.90:8009'
  } //header传值，例如：Authorization
});

// 允许跨越携带cookie信息
API.defaults.withCredentials = true;

/**
 * 请求失败后的错误统一处理
 * @param {Number} status 请求失败的状态码
 */
const errorHandle = (status, other) => {
  // 状态码判断
  switch (status) {
    case 401:
      router.push({
        path: "/ljlogin",
      });
    // 401: 未登录状态，跳转登录页
    case 403: //  403: 登录过期，请重新登录
      Toast("登录过期，请重新登录");
      // router.replace({
      //   path: "/SwitchTheLogin"
      // });
      // window.location.replace(process.env.VUE_APP_DoctorUserLoginUrl);
      break;
    case 404: // 404请求不存在
      // goUrl('/404')
      break;
    case 500:
      Toast("服务器出现错误");
      console.log("服务器出现错误");
      break;
    default:
      console.log("未知错误");
  }
};

let pending = []; //声明一个数组用于存储每个请求的取消函数和axios标识
let cancelToken = axios.CancelToken;
let removePending = config => {
  for (let p in pending) {
    /*
     *当前未分辨携带参数和请求类型，只要是俩次请求连接一样，就会取消上一次的请求
     * */
    // if(pending[p].u === config.url + JSON.stringify(config.data) +'&' + config.method) { //当前请求在数组中存在时执行函数体
    if (pending[p].u === config.url) {
      //当前请求在数组中存在时执行函数体
      pending[p].f(); //执行取消操作
      pending.splice(p, 1);
    }
  }
};

/**
 * 请求拦截器
 * 每次请求前，如果存在token则在请求头中携带token
 */
API.interceptors.request.use(
  config => {
    removePending(config); //在一个axios发送前执行一下取消操作
    config.cancelToken = new cancelToken(c => {
      //config.data为请求参数
      // pending.push({ u: config.url + JSON.stringify(config.data) +'&' + config.method, f: c });
      pending.push({
        u: config.url,
        f: c
      });
    });

    return Promise.resolve(config);
  },

  error => Promise.error(error)
);

// 响应拦截器
API.interceptors.response.use(
  // 请求成功
  data => {
    removePending(data.config); //在一个axios响应后再执行一下取消操作，把已经完成的请求从pending中移除
    return Promise.resolve(data);
  },

  // 请求失败
  error => {
    const { response } = error;
    if (response) {
      // 请求已发出，但是不在2xx的范围
      errorHandle(response.status, response.data.message);
      return Promise.reject(response);
    } else {
      // 处理断网的情况
    }
  }
);

//axios跨域请求
API.jsonp = url => {
  if (!url) {
    console.error("Axios.JSONP 至少需要一个url参数!");
    return;
  }
  return new Promise((resolve, reject) => {
    window.jsonCallBack = result => {
      resolve(result);
    };
    var JSONP = document.createElement("script");
    JSONP.type = "text/javascript";
    JSONP.src = `${url}&callback=jsonCallBack`;
    document.getElementsByTagName("head")[0].appendChild(JSONP);
    setTimeout(() => {
      document.getElementsByTagName("head")[0].removeChild(JSONP);
    }, 500);
  });
};

export default API;
