import { format, isValid, parseISO } from "date-fns";
import { enUS, km } from "date-fns/locale";

import { toKhmerDigits } from "@/lib/number-utils";

export type DateLanguage = "en" | "kh" | "km";

export type YearSelectOption = {
  label: string;
  value: string;
};

const DEFAULT_FIRST_YEAR = 2018;

export function getYearSelectOptions(
  firstYear = DEFAULT_FIRST_YEAR,
  currentYear = new Date().getFullYear(),
): YearSelectOption[] {
  if (currentYear < firstYear) {
    const year = String(currentYear);
    return [{ label: year, value: year }];
  }

  return Array.from({ length: currentYear - firstYear + 1 }, (_, index) => {
    const year = String(currentYear - index);
    return { label: year, value: year };
  });
}

export function getCurrentAndNextYearOptions(
  currentYear = new Date().getFullYear(),
  yearsAhead = 20,
): YearSelectOption[] {
  return Array.from({ length: yearsAhead + 1 }, (_, index) => {
    const year = String(currentYear + index);
    return { label: year, value: year };
  });
}

function isKhmerLanguage(language: DateLanguage) {
  return language === "kh" || language === "km";
}

export function formatDate(
  value?: string | Date | null,
  language: DateLanguage = "en",
): string {
  if (!value) return "-";

  const date = typeof value === "string" ? parseISO(value) : value;

  if (!isValid(date)) return "-";

  const isKhmer = isKhmerLanguage(language);
  const formattedDate = format(date, "dd MMMM yyyy", {
    locale: isKhmer ? km : enUS,
  });

  return isKhmer ? toKhmerDigits(formattedDate) : formattedDate;
}
