import { NextRequest, NextResponse } from "next/server";
import { db } from "@/lib/db";
import { requirePageRole } from "@/lib/auth";
import { logAudit } from "@/lib/audit";
import { handleApiError } from "@/lib/api-helpers";
import { classifyPaymentStatus } from "@/lib/fee-schedule";

/** تقرير حالة سداد الطلبة: مسدد | مستحق | متبقي
 *  القاعدة: القسط الصافي يقسم على 8 أشهر من تاريخ التسجيل،
 *  وكامل المبلغ يجب سداده قبل نهاية شهر نيسان من السنة الجديدة. */
export async function GET(req: NextRequest) {
  try {
    const user = await requirePageRole("reports", "ADMIN", "ACCOUNTANT");
    const { searchParams } = new URL(req.url);

    const [students, settings] = await Promise.all([
      db.student.findMany({
        where: { isActive: true },
        orderBy: { createdAt: "desc" },
        include: { payments: { select: { amount: true } } },
      }),
      db.schoolSettings.findUnique({ where: { id: "main" } }),
    ]);

    const asOf = new Date();

    const rows = students.map((s) => {
      const paid = s.payments.reduce((sum, p) => sum + p.amount, 0);
      const c = classifyPaymentStatus(s, paid, asOf);
      return {
        id: s.id,
        studentCode: s.studentCode,
        nameAr: s.nameAr,
        grade: s.grade,
        classroom: s.classroom,
        guardianPhone: s.guardianPhone,
        registeredAt: (s.registeredAt ?? s.createdAt).toISOString(),
        createdAt: s.createdAt.toISOString(),
        netFee: c.netFee,
        paid,
        expectedToDate: c.expectedToDate,
        dueNow: c.dueNow,
        remaining: c.remaining,
        monthsElapsed: c.monthsElapsed,
        deadline: c.deadline.toISOString(),
        pastDeadline: c.pastDeadline,
        status: c.status,
      };
    });

    // الترتيب: المتأخرون (تجاوزوا الموعد النهائي) ثم المستحق ثم المتبقي ثم المسدد، وبالأكبر مبلغاً أولاً
    const statusOrder: Record<string, number> = { DUE: 0, REMAINING: 1, PAID: 2 };
    rows.sort((a, b) => {
      if (a.status !== b.status) return statusOrder[a.status] - statusOrder[b.status];
      if (a.status === "DUE") {
        if (a.pastDeadline !== b.pastDeadline) return a.pastDeadline ? -1 : 1;
        return b.dueNow - a.dueNow;
      }
      if (a.status === "REMAINING") return b.remaining - a.remaining;
      return a.nameAr.localeCompare(b.nameAr, "ar");
    });

    const summary = {
      totalCount: rows.length,
      paidCount: rows.filter((r) => r.status === "PAID").length,
      dueCount: rows.filter((r) => r.status === "DUE").length,
      remainingCount: rows.filter((r) => r.status === "REMAINING").length,
      lateCount: rows.filter((r) => r.pastDeadline).length,
      totalPaid: rows.reduce((s, r) => s + r.paid, 0),
      totalDueNow: rows.reduce((s, r) => s + r.dueNow, 0),
      totalRemaining: rows.reduce((s, r) => s + r.remaining, 0),
    };

    if (searchParams.get("log") === "1") {
      await logAudit(user, {
        action: "EXPORT",
        entity: "Report",
        details: `تصدير/عرض تقرير مستحقات الطلبة — المسدد: ${summary.paidCount}، المستحق: ${summary.dueCount}، المتبقي: ${summary.remainingCount}، إجمالي المستحق الآن: ${summary.totalDueNow}`,
      });
    }

    return NextResponse.json({
      asOf: asOf.toISOString(),
      students: rows,
      summary,
      settings,
      installmentMonths: 8,
    });
  } catch (err) {
    return handleApiError(err);
  }
}
