/**
 * 简单 Ajax 请求
 * @param {object} config
 * @example
 * config = {
      api: '', // 必传
      method: '', // 可选，默认 POST
      data: {}, // 可选，作为 POST 的参数
      success: function, // 可选，作为成功的回调方法
      error: function, // 可选，作为失败或者超时（如果支持）的回调方法
      mime: 'text/plain', // 可选
      headers: {}, // 可选，如果是 POST 并且没有设置参数编码类型则会默认设置为表单编码
      timeout: 3000, // 可选，超时
      cache: false, // 可选，是否缓存 get 请求
      beforeSend: function // 可选，发送请求之前回调的方法
      progress: function //可选，进度事件（如果支持）
    }
 */
function ajax(config) {
  var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); // eslint-disable-line

  xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {
      if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
        if (config.success) {
          config.success(JSON.parse(xhr.responseText).response || {});
        }
      } else if (config.error) {
        config.error(xhr);
      }
    }
  };

  function parseParams(params) {
    var result = [];
    Object.keys(params).forEach(function (key) {
      result.push("".concat(encodeURIComponent(key), "=").concat(encodeURIComponent(params[key])));
    });
    return result.join('&');
  }

  config.method = config.method ? config.method.toUpperCase() : 'POST';

  if (config.method === 'POST') {
    config.headers = config.headers ? config.headers : {
      'Content-Type': 'application/x-www-form-urlencoded'
    };

    if (!('Content-Type' in config.headers)) {
      config.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
    }

    config.data = config.data ? config.data : {};
  }

  if (config.timeout) {
    xhr.timeout = config.timeout;

    if (config.error) {
      xhr.timetout = config.error;
    }
  }

  if (config.mime) {
    xhr.overrideMimeType(config.mime);
  }

  if (config.progress) {
    xhr.onprogress = config.progress;
  }

  if (config.method === 'GET' && !config.cache) {
    config.api = "".concat(config.api, "&_t").concat(Date.now());
  }

  var sendData = config.method === 'POST' || config.method === 'PUT' ? parseParams(config.data) : null;
  var apiBase = "".concat(window.location.origin, "/evh");
  xhr.open(config.method, apiBase + config.api, true);

  if (config.headers) {
    Object.keys(config.headers).forEach(function (key) {
      xhr.setRequestHeader(key, config.headers[key]);
    });
  }

  if (typeof config.beforeSend === 'function') {
    config.beforeSend(xhr, config);
  }

  xhr.send(sendData);
}

export default ajax;