import { NextRequest, NextResponse } from "next/server";
import { db } from "@/lib/db";
import { requirePageRole, resolveSchoolId } from "@/lib/auth";
import { handleApiError } from "@/lib/api-helpers";
import { effectiveFee } from "@/lib/constants";
import { ensureInstallmentSchedule } from "@/lib/installments";
import { INSTALLMENT_MONTHS } from "@/lib/fee-schedule";

/** بيانات كشف الأقساط التراكمي (v8.1) — لعرضها في الواجهة قبل التصدير
 *  ?grade=G5 — تصفية بمرحلة؛ ترجع الطلاب مع جدول أقساطهم وحالة الترحيل */
export async function GET(req: NextRequest) {
  try {
    const user = await requirePageRole("reports", "ADMIN", "ACCOUNTANT");
    const schoolId = await resolveSchoolId(user, req.nextUrl.searchParams.get("schoolId"));
    const gradeFilter = req.nextUrl.searchParams.get("grade")?.trim() ?? "";

    const students = await db.student.findMany({
      where: { schoolId, isActive: true, ...(gradeFilter ? { grade: gradeFilter } : {}) },
      orderBy: [{ grade: "asc" }, { classroom: "asc" }, { nameAr: "asc" }],
      select: {
        id: true, studentCode: true, nameAr: true, grade: true, classroom: true,
        totalFee: true, discountPercent: true, registeredAt: true,
        payments: { select: { amount: true, receiptNumber: true, paidAt: true } },
      },
    });

    for (const s of students) await ensureInstallmentSchedule(s.id);
    const installments = await db.installment.findMany({
      where: { studentId: { in: students.map((s) => s.id) } },
      orderBy: { seq: "asc" },
    });
    const instByStudent = new Map<string, typeof installments>();
    for (const i of installments) {
      const list = instByStudent.get(i.studentId) ?? [];
      list.push(i);
      instByStudent.set(i.studentId, list);
    }

    const rows = students.map((s) => {
      const insts = instByStudent.get(s.id) ?? [];
      const net = effectiveFee(s.totalFee, s.discountPercent);
      const paid = s.payments.reduce((sum, p) => sum + p.amount, 0);
      return {
        id: s.id,
        studentCode: s.studentCode,
        nameAr: s.nameAr,
        grade: s.grade,
        classroom: s.classroom,
        registeredAt: s.registeredAt,
        grossFee: s.totalFee,
        discountPercent: s.discountPercent,
        netFee: net,
        paid,
        remaining: Math.max(0, net - paid),
        installments: insts.map((i) => ({
          seq: i.seq, dueDate: i.dueDate, amount: i.amount,
          paidAmount: i.paidAmount, status: i.status,
        })),
        payments: s.payments.map((p) => ({
          receiptNumber: p.receiptNumber, amount: p.amount, paidAt: p.paidAt,
        })),
      };
    });

    const grades = [...new Set(students.map((s) => s.grade))].sort();
    return NextResponse.json({
      rows,
      grades,
      installmentMonths: INSTALLMENT_MONTHS,
      summary: {
        studentsCount: rows.length,
        totalNet: rows.reduce((s, r) => s + r.netFee, 0),
        totalPaid: rows.reduce((s, r) => s + r.paid, 0),
        totalRemaining: rows.reduce((s, r) => s + r.remaining, 0),
      },
    });
  } catch (err) {
    return handleApiError(err);
  }
}
