"use strict";

const { getAbbreviatedMimeType,
        getUriNameWithQuery,
        getUriHostPort,
        loadCauseString } = require("./request-utils");

/**
 * Predicates used when sorting items.
 *
 * @param object first
 *        The first item used in the comparison.
 * @param object second
 *        The second item used in the comparison.
 * @return number
 *         <0 to sort first to a lower index than second
 *         =0 to leave first and second unchanged with respect to each other
 *         >0 to sort second to a lower index than first
 */

function waterfall(first, second) {
  return first.startedMillis - second.startedMillis;
}

function status(first, second) {
  return first.status == second.status
         ? first.startedMillis - second.startedMillis
         : first.status - second.status;
}

function method(first, second) {
  if (first.method == second.method) {
    return first.startedMillis - second.startedMillis;
  }
  return first.method > second.method ? 1 : -1;
}

function file(first, second) {
  let firstUrl = getUriNameWithQuery(first.url).toLowerCase();
  let secondUrl = getUriNameWithQuery(second.url).toLowerCase();
  if (firstUrl == secondUrl) {
    return first.startedMillis - second.startedMillis;
  }
  return firstUrl > secondUrl ? 1 : -1;
}

function domain(first, second) {
  let firstDomain = getUriHostPort(first.url).toLowerCase();
  let secondDomain = getUriHostPort(second.url).toLowerCase();
  if (firstDomain == secondDomain) {
    return first.startedMillis - second.startedMillis;
  }
  return firstDomain > secondDomain ? 1 : -1;
}

function cause(first, second) {
  let firstCause = loadCauseString(first.cause.type);
  let secondCause = loadCauseString(second.cause.type);
  if (firstCause == secondCause) {
    return first.startedMillis - second.startedMillis;
  }
  return firstCause > secondCause ? 1 : -1;
}

function type(first, second) {
  let firstType = getAbbreviatedMimeType(first.mimeType).toLowerCase();
  let secondType = getAbbreviatedMimeType(second.mimeType).toLowerCase();
  if (firstType == secondType) {
    return first.startedMillis - second.startedMillis;
  }
  return firstType > secondType ? 1 : -1;
}

function transferred(first, second) {
  return first.transferredSize - second.transferredSize;
}

function size(first, second) {
  return first.contentSize - second.contentSize;
}

exports.Sorters = {
  status,
  method,
  file,
  domain,
  cause,
  type,
  transferred,
  size,
  waterfall,
};