import _ from 'lodash';
import { fetch } from './polyfill';
import { encrypt } from './helper';
import { errors } from './error';
import { getToken } from './auth';
import { checkStatus, normParams, parseObject } from './http-helper';

const defaultOptions = {
  timeout: 30 * 1000,
  headers: { Accept: 'application/json' },
};

/**
 * Requests a URL, returning a promise.
 *
 * @param  {string} url       The URL we want to request
 * @param auth
 * @param params
 * @param  {object} [options] The options we want to pass to "fetch"
 * @return {object}           An object containing either "data" or "err"
 */
export default async function doDelete(url, params = {}, options = {}, auth = true) {
  let token;
  if (auth) {
    token = await getToken();
    if (!token) {
      return Promise.reject(errors.tokenMissing());
    }
    token = encrypt(token);
  }
  let queryParams = token ? [...normParams(params), ['token', token]] : normParams(params);
  queryParams = queryParams.map(([k, v]) => (_.isNil(v) ? k : `${k}=${encodeURIComponent(v)}`));
  queryParams = queryParams.join('&');
  let realUrl = url;
  if (queryParams) {
    realUrl = `${url}?${queryParams}`;
  }
  const realOptions = _.defaults(options, defaultOptions);
  realOptions.method = 'DELETE';
  return fetch(realUrl, realOptions)
    .then(checkStatus)
    .then(parseObject);
}