import {Message} from 'element-ui'

export default function ({app, $axios, store, redirect}) {

  function generateReqKey(config) {
    const { method, url, params, data } = config;
    return [method, url, JSON.stringify(params), JSON.stringify(data)].join("&");
  }

  const pendingRequest = new Map();
  function addPendingRequest(config) {
    const requestKey = generateReqKey(config);
    config.cancelToken = config.cancelToken || new $axios.CancelToken((cancel) => {
      if (!pendingRequest.has(requestKey)) {
        pendingRequest.set(requestKey, cancel);
      }
    });
  }

  function removePendingRequest(config) {
    const requestKey = generateReqKey(config);
    if (pendingRequest.has(requestKey)) {
      const cancelToken = pendingRequest.get(requestKey);
      cancelToken(requestKey);
      pendingRequest.delete(requestKey);
    }
  }

  $axios.onRequest(config => {
    let fingerprint = store.state.fingerprint;
    if (fingerprint) {
      config.headers['fingerprint'] = fingerprint
    }
  })

  $axios.interceptors.request.use(
    function (config) {
      // 检查是否存在重复请求,若存在则取消已发的请求
      removePendingRequest(config);
      // 把当前请求信息添加到pendingRequest对象中
      addPendingRequest(config);
      return config;
    },
    (error) => {
      return Promise.reject(error);
    }
  );

  $axios.onResponse(response => {
    return new Promise((resolve, reject) => {
      removePendingRequest(response.config);
      //返回数据逻辑处理 比如:error_code错误处理
      let message;
      if (typeof (response.data.data) !== 'undefined') {
        message = response.data.data.message
      } else if (typeof (response.data) !== 'undefined') {
        message = response.data.message
      }
      if (response.data.success) {
        resolve(response.data);
      } else {
        if (response.data.code === 0) {
          Message.error(message ? message : '服务异常')
        } else if (response.data.code === 401) {
          app.$auth.logout()
        } else if (response.data.code === 404) {
          Message.error('操作失败,请稍后再试......')
        } else if (response.data.code === 500) {
          Message.error('服务器正在开小差,请稍后再试......')
        } else {
          Message.error(response.data.message);
        }
      }
      reject(response);
    })
  });

  $axios.onError(error => {
    removePendingRequest(error.config || {}); // 从pendingRequest对象中移除请求
    if ($axios.isCancel(error)) {
      // console.log("已取消的重复请求:" + error.message);
    } else {
      // 添加异常处理
      const code = parseInt(error.response && error.response.status)
      if (code === 400) {
        redirect('/400');
      } else {
        console.log(error.data);
      }
    }

  })
}