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

/** The caller's own (child's) weekly class routine — active schedules for
    their class, whole-class rows plus rows scoped to their section. */
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 [schedules, selections] = await Promise.all([
    prisma.classSchedule.findMany({
      where: {
        institutionId: session.institutionId,
        isActive: true,
        classItemId: student.classItemId ?? -1,
        OR: [{ sectionItemId: null }, { sectionItemId: student.sectionItemId ?? -1 }],
      },
      orderBy: { startTime: "asc" },
      select: {
        id: true,
        days: true,
        startTime: true,
        endTime: true,
        note: true,
        subjectItemId: true,
        roomItemId: true,
        staff: { select: { name: true, nameBn: true } },
      },
    }),
    // Name lookup for schedule FK columns (ClassSchedule has no item relations)
    prisma.academicSelection.findMany({
      where: { institutionId: session.institutionId },
      select: { academicItem: { select: { id: true, name: true, nameBn: true } } },
    }),
  ]);

  const names = new Map(
    selections.map((s) => [s.academicItem.id, { name: s.academicItem.name, nameBn: s.academicItem.nameBn }])
  );
  const label = (id: number | null) => (id ? names.get(id)?.name ?? null : null);
  const labelBn = (id: number | null) => (id ? names.get(id)?.nameBn ?? null : null);

  return NextResponse.json({
    routine: schedules.map((r) => ({
      id: r.id,
      days: r.days,
      startTime: r.startTime,
      endTime: r.endTime,
      note: r.note,
      subjectName: label(r.subjectItemId),
      subjectNameBn: labelBn(r.subjectItemId),
      roomName: label(r.roomItemId),
      roomNameBn: labelBn(r.roomItemId),
      teacherName: r.staff?.name ?? null,
      teacherNameBn: r.staff?.nameBn ?? null,
    })),
  });
}
