import DateObject from "react-date-object";
import gregorian from "react-date-object/calendars/gregorian";
import gregorian_en from "react-date-object/locales/gregorian_en";
import persian from "react-date-object/calendars/persian";
import persian_fa from "react-date-object/locales/persian_fa";

/** ۱ مهر — مبنای محاسبه سن برای ثبت‌نام */
export const ENROLLMENT_REFERENCE = { month: 7, day: 1 } as const;

export function parseAcademicYearStart(title?: string | null): number | null {
  if (!title) return null;
  const match = title.match(/^(\d{4})/);
  return match ? Number(match[1]) : null;
}

export function jalaliPartsToGregorianIso(jy: number, jm: number, jd: number): string | null {
  try {
    const d = new DateObject({
      year: jy,
      month: jm,
      day: jd,
      calendar: persian,
      locale: persian_fa,
    }).convert(gregorian, gregorian_en);
    return d.format("YYYY-MM-DD");
  } catch {
    return null;
  }
}

export function formatPersianDate(jy: number, jm: number, jd: number): string {
  try {
    return new DateObject({
      year: jy,
      month: jm,
      day: jd,
      calendar: persian,
      locale: persian_fa,
    }).format("D MMMM YYYY");
  } catch {
    return `${jy}/${String(jm).padStart(2, "0")}/${String(jd).padStart(2, "0")}`;
  }
}

export function resolveBirthDateBoundsFromAges(
  refYear: number,
  minAge: number | null | undefined,
  maxAge: number | null | undefined,
): { birth_date_from: string | null; birth_date_to: string | null } {
  const { month, day } = ENROLLMENT_REFERENCE;

  const birth_date_from =
    maxAge != null && !Number.isNaN(maxAge)
      ? jalaliPartsToGregorianIso(refYear - maxAge, month, day)
      : null;

  const birth_date_to =
    minAge != null && !Number.isNaN(minAge)
      ? jalaliPartsToGregorianIso(refYear - minAge, month, day)
      : null;

  return { birth_date_from, birth_date_to };
}

export function formatMehrOne(jy: number): string {
  return `۱ مهر ${jy.toLocaleString("fa-IR")}`;
}

/** متن راهنما برای مدیر: بازه متولدین مجاز بر اساس ۱ مهر */
export function describeAgeEligibility(
  refYear: number,
  minAge: number | string | null | undefined,
  maxAge: number | string | null | undefined,
): string | null {
  const min = minAge != null && minAge !== "" ? Number(minAge) : null;
  const max = maxAge != null && maxAge !== "" ? Number(maxAge) : null;

  if (min == null && max == null) return null;
  if (min != null && max != null && min > max) {
    return "حداقل سن نباید بزرگ‌تر از حداکثر سن باشد.";
  }

  if (min != null && max != null && !Number.isNaN(min) && !Number.isNaN(max)) {
    return `متولدین از ${formatMehrOne(refYear - max)} تا ${formatMehrOne(refYear - min)} امکان ثبت‌نام خواهند داشت.`;
  }

  if (max != null && !Number.isNaN(max)) {
    return `متولدین از ${formatMehrOne(refYear - max)} به بعد امکان ثبت‌نام خواهند داشت.`;
  }

  if (min != null && !Number.isNaN(min)) {
    return `متولدین تا ${formatMehrOne(refYear - min)} امکان ثبت‌نام خواهند داشت.`;
  }

  return null;
}
