import config from '../config/index.js';
import { showLoadingToast, showToast, closeToast } from 'vant';
import 'vant/lib/toast/style/index';

function getdata(data) {
  let text = '';
  for (const key in data) {
    text += key + '=' + data[key] + '&';
  }
  text ? (text = '?' + text) : '';
  text = text.replace(/&$/, '');
  return text;
}

export default function (ori) {
  let baseurl = config.base[ori.urlType || 'origin'];
  let url = baseurl + ori.url;
  let isEnd = false;
  let noToast = ori.noToast;
  let defaultErrorToast = ori.errorToast || '请求失败!';
  let time = setTimeout(() => {
    clearTimeout(time);
    !isEnd &&
      !ori.noLoad &&
      showLoadingToast({
        message: '加载中...',
        forbidClick: true,
        duration: 0,
      });
  }, 300);
  return new Promise((resolve, reject) => {
    var xhttp;
    if (window.XMLHttpRequest) xhttp = new XMLHttpRequest();
    else if (window.ActiveXObject)
      xhttp = new window.ActiveXObject('Microsoft.XMLHTTP');
    let method = ori.method.toUpperCase();
    if (method === 'GET') url += getdata(ori.data || {});
    xhttp.open(method, url, true);
    xhttp.setRequestHeader(
      'Content-type',
      ori.header && ori.header.contentType
        ? ori.header.contentType
        : 'application/json'
    );
    xhttp.setRequestHeader(
      'Authorization',
      ori.header && ori.header.Authorization
    );
    if (ori.isUpFile) xhttp.send(ori.data);
    else if (method === 'POST') xhttp.send(JSON.stringify(ori.data));
    else xhttp.send();
    xhttp.onreadystatechange = function () {
      if (this.readyState != 4) return;
      isEnd = true;
      closeToast();
      if (this.status != 200) {
        let t = JSON.parse(this.responseText || '{}');
        !noToast && showToast(t.message || defaultErrorToast);
        reject(t);
        return;
      }
      let data = {};
      try {
        data =
          this.responseText !== 'null'
            ? JSON.parse(this.responseText || '{}')
            : {};
      } catch (err) {
        !noToast && showToast(defaultErrorToast);
        console.error(err);
        reject(err);
      }
      if (data.code === 0 || ori.next) resolve(data.data);
      else reject(data);
    };
  });
}
