/*
 * Frontend timestamps.
 */

const strings = {
  seconds: 'less than a minute',
  minute: 'about a minute',
  minutes: '%d minutes',
  hour: 'about an hour',
  hours: 'about %d hours',
  day: 'a day',
  days: '%d days',
  month: 'about a month',
  months: '%d months',
  year: 'about a year',
  years: '%d years',
};

function distance(time) {
  return new Date() - time;
}

function substitute(key, amount) {
  return strings[key].replace('%d', Math.round(amount));
}

function setTimeAgo(el) {
  const date = new Date(el.getAttribute('datetime'));
  const distMillis = distance(date);

  const seconds = Math.abs(distMillis) / 1000,
        minutes = seconds / 60,
        hours   = minutes / 60,
        days    = hours / 24,
        months  = days / 30,
        years   = days / 365;

  const words =
    seconds < 45  && substitute('seconds', seconds) ||
    seconds < 90  && substitute('minute', 1)        ||
    minutes < 45  && substitute('minutes', minutes) ||
    minutes < 90  && substitute('hour', 1)          ||
    hours   < 24  && substitute('hours', hours)     ||
    hours   < 42  && substitute('day', 1)           ||
    days    < 30  && substitute('days', days)       ||
    days    < 45  && substitute('month', 1)         ||
    days    < 365 && substitute('months', months)   ||
    years   < 1.5 && substitute('year', 1)          ||
                     substitute('years', years);

  if (!el.getAttribute('title')) {
    el.setAttribute('title', el.textContent);
  }
  el.textContent = words + (distMillis < 0 ? ' from now' : ' ago');
}

function timeAgo(args) {
  [].forEach.call(args, el => setTimeAgo(el));
}

function setupTimestamps() {
  timeAgo(document.getElementsByTagName('time'));
  window.setTimeout(setupTimestamps, 60000);
}

export { setupTimestamps };

window.booru.timeAgo = timeAgo;