import isNumber from "../utils/is-number.js";
import { getLocale } from "./locales.js";
import { createUTC } from "../create/utc.js";

function get(format, index, field, setter) {
  var locale = getLocale(),
      utc = createUTC().set(setter, index);
  return locale[field](utc, format);
}

function listMonthsImpl(format, index, field) {
  if (isNumber(format)) {
    index = format;
    format = undefined;
  }

  format = format || '';

  if (index != null) {
    return get(format, index, field, 'month');
  }

  var i,
      out = [];

  for (i = 0; i < 12; i++) {
    out[i] = get(format, i, field, 'month');
  }

  return out;
} // ()
// (5)
// (fmt, 5)
// (fmt)
// (true)
// (true, 5)
// (true, fmt, 5)
// (true, fmt)


function listWeekdaysImpl(localeSorted, format, index, field) {
  if (typeof localeSorted === 'boolean') {
    if (isNumber(format)) {
      index = format;
      format = undefined;
    }

    format = format || '';
  } else {
    format = localeSorted;
    index = format;
    localeSorted = false;

    if (isNumber(format)) {
      index = format;
      format = undefined;
    }

    format = format || '';
  }

  var locale = getLocale(),
      shift = localeSorted ? locale._week.dow : 0,
      i,
      out = [];

  if (index != null) {
    return get(format, (index + shift) % 7, field, 'day');
  }

  for (i = 0; i < 7; i++) {
    out[i] = get(format, (i + shift) % 7, field, 'day');
  }

  return out;
}

export function listMonths(format, index) {
  return listMonthsImpl(format, index, 'months');
}
export function listMonthsShort(format, index) {
  return listMonthsImpl(format, index, 'monthsShort');
}
export function listWeekdays(localeSorted, format, index) {
  return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
}
export function listWeekdaysShort(localeSorted, format, index) {
  return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
}
export function listWeekdaysMin(localeSorted, format, index) {
  return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
}