import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { requireAnyRole } from "@/lib/auth";
import { getMemberStudentId } from "@/lib/member";

/** Published exam routines of the caller's own (child's) class — students
    and parents only see exams whose schedule the institution published. */
export async function GET() {
  const session = await requireAnyRole(["STUDENT", "PARENT"]);
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  const studentId = await getMemberStudentId(session.userId);
  if (!studentId) {
    return NextResponse.json({ error: "NO_LINKED_STUDENT" }, { status: 409 });
  }
  const student = await prisma.student.findUnique({
    where: { id: studentId },
    select: { classItemId: true, sectionItemId: true },
  });
  if (!student) {
    return NextResponse.json({ error: "NO_LINKED_STUDENT" }, { status: 409 });
  }

  const exams = await prisma.exam.findMany({
    where: {
      institutionId: session.institutionId,
      schedulePublished: true,
      OR: [
        { classItemId: student.classItemId, sectionItemId: null },
        { classItemId: student.classItemId, sectionItemId: student.sectionItemId },
      ],
    },
    orderBy: [{ status: "asc" }, { startDate: "asc" }],
    select: {
      id: true,
      name: true,
      nameBn: true,
      status: true,
      startDate: true,
      endDate: true,
      note: true,
      resultPublished: true,
      classItem: { select: { name: true, nameBn: true } },
      schedules: {
        orderBy: [{ date: "asc" }, { startTime: "asc" }],
        select: {
          id: true,
          date: true,
          startTime: true,
          endTime: true,
          fullMarks: true,
          totalPassMarks: true,
          subjectItem: { select: { name: true, nameBn: true } },
          roomItem: { select: { name: true, nameBn: true } },
        },
      },
    },
  });

  return NextResponse.json({
    exams: exams.map((e) => ({
      ...e,
      className: e.classItem?.name ?? null,
      classNameBn: e.classItem?.nameBn ?? null,
      classItem: undefined,
    })),
  });
}
