import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';

dayjs.extend(utc)

// https://stackoverflow.com/a/50130338
export function formatISO(date) {
  return date.format('YYYY-MM-DD')
}

export function shiftMonths(date, months) {
  return date.add(months, 'months')
}

export function shiftDays(date, days) {
  return date.add(days, 'days')
}

export function formatMonthYYYY(date) {
  return date.format('MMMM YYYY')
}

export function formatYear(date) {
  return `Year of ${date.year()}`;
}

export function formatYearShort(date) {
   return date.getUTCFullYear().toString().substring(2)
}

export function formatDay(date) {
  if (date.year() !== dayjs().year()) {
    return date.format('ddd, DD MMM YYYY')
  } else {
    return date.format('ddd, DD MMM')
  }
}

export function formatDayShort(date, includeYear = false) {
  if (includeYear) {
    return date.format('D MMM YY')
  } else {
    return date.format('D MMM')
  }
}

export function formatDateRange(site, from, to) {
  if (!from || !to) return
  if (typeof from === 'string') from = parseUTCDate(from)
  if (typeof to === 'string') to = parseUTCDate(to)

  if (from.isSame(to)) {
    return formatDay(from)
  } else if (from.isSame(to, 'year')) {
    const includeYear = !isThisYear(site, from)
    return `${formatDayShort(from, false)} - ${formatDayShort(to, includeYear)}`
  } else {
    return `${formatDayShort(from, true)} - ${formatDayShort(to, true)}`
  }
}

export function parseUTCDate(dateString) {
  return dayjs.utc(dateString)
}

export function parseNaiveDate(dateString) {
  return dayjs(dateString)
}

export function nowForSite(site) {
  return dayjs.utc().utcOffset(site.offset / 60)
}

export function yesterday(site) {
  return nowForSite(site).subtract(1, 'day')
}

export function lastMonth(site) {
  return shiftMonths(nowForSite(site), -1)
}

export function isSameDate(date1, date2) {
  return formatISO(date1) === formatISO(date2)
}

export function isSameMonth(date1, date2) {
  return formatMonthYYYY(date1) === formatMonthYYYY(date2)
}

export function isToday(site, date) {
  return isSameDate(date, nowForSite(site))
}

export function isThisMonth(site, date) {
  return formatMonthYYYY(date) === formatMonthYYYY(nowForSite(site))
}

export function isThisYear(site, date) {
  return date.year() === nowForSite(site).year()
}

export function isBefore(date1, date2, period) {
  /* assumes 'day' and 'month' are the only valid periods */
  if (date1.year() !== date2.year()) {
    return date1.year() < date2.year();
  }
  if (period === "year") {
    return false;
  }
  if (date1.month() !== date2.month()) {
    return date1.month() < date2.month();
  }
  if (period === "month") {
    return false;
  }
  return date1.date() < date2.date()
}

export function isAfter(date1, date2, period) {
  /* assumes 'day' and 'month' are the only valid periods */
  if (date1.year() !== date2.year()) {
    return date1.year() > date2.year();
  }
  if (period === "year") {
    return false;
  }
  if (date1.month() !== date2.month()) {
    return date1.month() > date2.month();
  }
  if (period === "month") {
    return false;
  }
  return date1.date() > date2.date()
}
