import config from '@/config';
import { log } from '@/utils';
import qs from 'qs';
import axios from 'axios';
// eslint-disable-next-line
// const router = new VueRouter();
import router from '../../router/index';
import store from '../../store/index';
import Vue from 'vue';

/**
 * 兼容 errorCode:0 ||  code:'0' 为正确返回的接口
 *
 */

// 加载最小时间
const MINI_TIME = 300;
// 超时时间
// 环境value
// eslint-disable-next-line
let _isDev = process.env.NODE_ENV === 'development';
// 请求接口host
let _apiHost = config.api;
// 请求组（判断当前请求数）
let _requests = [];

axios.defaults.baseURL = _apiHost;

// 创建一个请求实例
/**
 * 添加请求，显示loading
 * @param {请求配置} config
 */
function pushRequest(config) {
  log(`${config.url}--begin`);
  _requests.push(config);
}

/**
 * 移除请求，无请求时关闭loading
 * @param {请求配置} config
 */
function popRequest(config) {
  log(`${config.url}--end`);
  let _index = _requests.findIndex(r => {
    return r === config;
  });
  if (_index > -1) {
    _requests.splice(_index, 1);
  }
}
/**
 * 错误的处理
 * @param {*} code
 * @param {string} [message='请求错误']
 */
function handlerErr(code, message = '请求错误') {
  switch (code) {
    // case 404:
    //   message = '404,错误请求';
    //   router.push('/404');
    //   break;
    case 401:
      if (!_isDev) {
        window.location.href = config.api + 'gic-web/';
      }
      message = '登录失效';
      break;
    case 403:
      message = '禁止访问';
      router.push('/403');
      break;
    case 408:
      message = '请求超时';
      break;
    case 500:
      message = '服务器内部错误';
      // router.push('/500')
      break;
    case 501:
      message = '功能未实现';
      break;
    case 503:
      message = '服务不可用';
      break;
    case 504:
      message = '网关错误';
      break;
  }

  Vue.prototype.$tips({ type: 'warning', message: message });
}

const pendingRequest = new Map();

/**
 * 请求地址，请求数据，是否静默，请求方法
 */
const requests = (url, data = {}, contentTypeIsJSON = false, isSilence = false, method = 'POST', urlData) => {
  let _opts = { method, url };
  let _timer = null;
  // 如果用户没有开启权限 从参数中删除showSelfFlag
  if (!store.state.marketing.openFlag) {
    delete data.showSelfFlag;
  }
  if (method.toLocaleUpperCase() === 'POST') {
    if (contentTypeIsJSON) {
      _opts.data = data;
      _opts.headers = { 'Content-Type': 'application/json' };
      _opts.url += urlData ? '?requestProject=marketing' + urlData : '?requestProject=marketing';
    } else {
      _opts.data = qs.stringify(Object.assign({ requestProject: 'gic-web' }, data));
    }
  } else {
    _opts.params = Object.assign({ requestProject: 'gic-web' }, data);
  }

  let key = JSON.stringify(_opts);
  if (!pendingRequest.has(key)) {
    pendingRequest.set(key, Date.now());
  } else if (Date.now() - pendingRequest.get(key) > 1000) {
    pendingRequest.delete(key);
  } else {
    return Promise.reject();
  }

  return new Promise((resolve, reject) => {
    let _random = { stamp: Date.now(), url: `${_apiHost + url}` };
    if (!isSilence) {
      _timer = setTimeout(() => {
        pushRequest(_random);
      }, MINI_TIME);
    }
    _opts.headers = Object.assign({}, _opts.headers || {}, { sign: localStorage.getItem('sign') }); // 加入自定义请求头
    axios(_opts)
      .then(res => {
        clearTimeout(_timer);
        popRequest(_random);
        if (res.data.errorCode !== 0 && res.data.code != 0) {
          reject(res);
          if (res.data.message.indexOf('抱歉') >= 0) {
            Vue.prototype.$alert(res.data.message, '提示');
          } else if (res.data.errorCode == 170009) {
            // return; //在核销记录的新增员工时 校验手机号重复后依然回调保存接口并弹出提示信息，为了去掉信息
            if (res.data.message == '核销会员手机号已存在，无法重复添加') {
              // return
            } else {
              handlerErr(res.data.errorCode, res.data.message);
            }
          } else {
            handlerErr(res.data.errorCode, res.data.message);
          }
        } else {
          resolve(res.data);
        }
      })
      .catch(res => {
        clearTimeout(_timer);
        popRequest(_random);
        pendingRequest.delete(key);
        if (res) {
          handlerErr(res.response.status, '接口异常');
        }
        reject(res);
      });
  });
};

export { axios, requests };
