export const apiRequest = (method, url, body) =>
  fetch(url, {
    method,
    cache: 'no-cache',
    headers: {
      Accept: 'application/json',
      'Content-Type': 'application/json',
    },
    body,
  }).then(res => {
    if (res.ok) {
      return res.json();
    }

    if (['post', 'put', 'delete'].includes(method)) {
      return res.text();
    }

    return null;
  });

function parseQuery(url, params = {}) {
  const query = Object.keys(params).reduce((values, key) => {
    if (params[key] !== undefined) {
      return values.concat(`${key}=${encodeURIComponent(params[key])}`);
    }
    return values;
  }, []);
  return query.length ? `${url}?${query.join('&')}` : url;
}

export const get = (url, params) => apiRequest('get', parseQuery(url, params));

export const del = (url, params) => apiRequest('delete', parseQuery(url, params));

export const post = (url, params) => apiRequest('post', url, JSON.stringify(params));

export const put = (url, params) => apiRequest('put', url, JSON.stringify(params));

export const hook = (_this, method, callback) => {
  const orig = _this[method];

  return (...args) => {
    callback.apply(null, args);

    return orig.apply(_this, args);
  };
};

export const doNotTrack = () => {
  if (
    window.doNotTrack ||
    navigator.doNotTrack ||
    navigator.msDoNotTrack ||
    'msTrackingProtectionEnabled' in window.external
  ) {
    if (
      window.doNotTrack == '1' ||
      navigator.doNotTrack == 'yes' ||
      navigator.doNotTrack == '1' ||
      navigator.msDoNotTrack == '1' ||
      (window.external &&
        window.external.msTrackingProtectionEnabled &&
        window.external.msTrackingProtectionEnabled())
    ) {
      return true;
    } else {
      return false;
    }
  } else {
    return false;
  }
};