/** قاعدة سداد الأقساط: القسط يقسم على 8 أشهر من تاريخ تسجيل الطالب،
 *  ويجب سداد كامل المبلغ قبل نهاية شهر نيسان (الشهر الرابع) من السنة الجديدة.
 *  شهر التسجيل نفسه يُعد الشهر الأول: القسط الأول يستحق فور تسجيل الطالب،
 *  لذا الطالب الجديد الذي لم يسدد أول قسط يظهر مباشرة ضمن "المستحق".
 *  تُستخدم هذه المكتبة في الخادم (API التقارير) والواجهة (صفحة التقارير) معاً. */

import { effectiveFee } from "@/lib/constants";

/** عدد أشهر تقسيط القسط */
export const INSTALLMENT_MONTHS = 8;

export type PaymentStatus = "PAID" | "DUE" | "REMAINING";

export const PAYMENT_STATUS_AR: Record<PaymentStatus, string> = {
  PAID: "مسدد",
  DUE: "مستحق",
  REMAINING: "متبقي",
};

/** الموعد النهائي لسداد كامل القسط: نهاية شهر نيسان (الشهر الرابع) من السنة الجديدة التالية لسنة التسجيل */
export function paymentDeadlineFor(registeredAt: Date | string): Date {
  const d = typeof registeredAt === "string" ? new Date(registeredAt) : registeredAt;
  return new Date(d.getFullYear() + 1, 3, 30, 23, 59, 59, 999); // 30 نيسان من السنة التالية
}

/** عدد أشهر الأقساط التي بدأ استحقاقها من تاريخ التسجيل حتى تاريخ الفحص.
 *  شهر التسجيل نفسه = الشهر الأول (القسط الأول يستحق فور التسجيل)،
 *  والشهر الجاري يُحتسب بمجرد بدايته، بحد أقصى 8 أشهر. */
export function elapsedInstallmentMonths(from: Date, to: Date): number {
  const diff = (to.getFullYear() - from.getFullYear()) * 12 + (to.getMonth() - from.getMonth()) + 1;
  return Math.max(0, Math.min(INSTALLMENT_MONTHS, diff));
}

export interface PaymentStatusResult {
  /** القسط الصافي بعد الخصم */
  netFee: number;
  /** حصة الشهر الواحد (netFee ÷ 8) */
  monthlyInstallment: number;
  /** عدد أشهر الأقساط التي استحقت حتى الآن (شهر التسجيل = الأول، بحد أقصى 8) */
  monthsElapsed: number;
  /** المبلغ المطلوب سداده حتى الآن حسب الجدول */
  expectedToDate: number;
  /** المسدد فعلياً */
  paid: number;
  /** المستحق الآن وغير المسدد (وبعد الموعد النهائي يصبح كامل المتبقي مستحقاً) */
  dueNow: number;
  /** المتبقي على كامل القسط */
  remaining: number;
  /** الموعد النهائي لسداد كامل القسط */
  deadline: Date;
  /** هل تجاوز الموعد النهائي مع وجود مبلغ متبقٍ (متأخر عن السداد) */
  pastDeadline: boolean;
  /** الحالة: مسدد | مستحق | متبقي */
  status: PaymentStatus;
}

/** تصنيف حالة سداد طالب وفق قاعدة التقسيط على 8 أشهر من تاريخ التسجيل */
export function classifyPaymentStatus(
  student: {
    totalFee: number;
    discountPercent: number;
    /** تاريخ التسجيل الفعلي — ويُرجع تلقائياً لتاريخ الإنشاء إذا غاب */
    registeredAt?: Date | string;
    createdAt: Date | string;
  },
  paid: number,
  asOf: Date = new Date()
): PaymentStatusResult {
  const regDate = new Date(student.registeredAt ?? student.createdAt);
  const netFee = effectiveFee(student.totalFee, student.discountPercent);
  const monthlyInstallment = netFee / INSTALLMENT_MONTHS;
  const monthsElapsed = elapsedInstallmentMonths(regDate, asOf);
  const expectedToDate = Math.min(netFee, Math.round(monthlyInstallment * monthsElapsed));
  const remaining = Math.max(0, netFee - paid);
  const deadline = paymentDeadlineFor(regDate);
  const pastDeadline = remaining > 0 && asOf.getTime() > deadline.getTime();
  const dueNow = pastDeadline ? remaining : Math.max(0, expectedToDate - paid);
  const status: PaymentStatus = remaining <= 0 ? "PAID" : dueNow > 0 ? "DUE" : "REMAINING";
  return {
    netFee,
    monthlyInstallment,
    monthsElapsed,
    expectedToDate,
    paid,
    dueNow,
    remaining,
    deadline,
    pastDeadline,
    status,
  };
}
