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";

function toPersian(iso: string): DateObject | null {
  if (!iso) return null;
  try {
    return new DateObject({
      date: iso,
      format: "YYYY-MM-DD",
      calendar: gregorian,
      locale: gregorian_en,
    }).convert(persian, persian_fa);
  } catch {
    return null;
  }
}

/** Age in completed years on a given as-of date (default: today). */
export function ageInYears(iso: string, asOfIso?: string): number | null {
  const birth = toPersian(iso);
  if (!birth) return null;
  const asOf = asOfIso
    ? toPersian(asOfIso)
    : new DateObject({ calendar: persian, locale: persian_fa });
  if (!asOf) return null;

  let years = asOf.year - birth.year;
  if (asOf.month.number < birth.month.number
    || (asOf.month.number === birth.month.number && asOf.day < birth.day)) {
    years -= 1;
  }
  return years;
}

/**
 * birth_date_from = oldest allowed (earliest birth) → larger age
 * birth_date_to = youngest allowed (latest birth) → smaller age
 */
export function describeBirthDateAgeRange(fromIso?: string, toIso?: string): string | null {
  if (!fromIso && !toIso) return null;

  const ageFrom = fromIso ? ageInYears(fromIso) : null;
  const ageTo = toIso ? ageInYears(toIso) : null;

  if (ageFrom != null && ageTo != null) {
    const minAge = Math.min(ageFrom, ageTo);
    const maxAge = Math.max(ageFrom, ageTo);
    if (minAge === maxAge) {
      return `با این بازه، امروز افراد حدود ${minAge.toLocaleString("fa-IR")} ساله واجد شرایط‌اند.`;
    }
    return `با این بازه، امروز افراد حدوداً از ${minAge.toLocaleString("fa-IR")} تا ${maxAge.toLocaleString("fa-IR")} ساله واجد شرایط‌اند.`;
  }

  if (ageFrom != null) {
    return `تاریخ «از» یعنی حداکثر سن تقریبی امروز: ${ageFrom.toLocaleString("fa-IR")} سال.`;
  }
  if (ageTo != null) {
    return `تاریخ «تا» یعنی حداقل سن تقریبی امروز: ${ageTo.toLocaleString("fa-IR")} سال.`;
  }
  return null;
}
