import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { requireCampusInstitution } from "@/lib/auth";

/** Course offerings — a course opened for a session (cohort), optionally
    per section with an assigned teacher. Filters: ?programId=&sessionYear=. */
export async function GET(req: Request) {
  const session = await requireCampusInstitution();
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  const sp = new URL(req.url).searchParams;
  const programId = Number(sp.get("programId"));
  const sessionYear = (sp.get("sessionYear") ?? "").trim();
  const offerings = await prisma.cuOffering.findMany({
    where: {
      institutionId: session.institutionId,
      ...(sessionYear ? { sessionYear } : {}),
      ...(Number.isFinite(programId) && programId > 0 ? { course: { programId } } : {}),
    },
    orderBy: [{ sessionYear: "desc" }, { id: "desc" }],
    include: {
      course: {
        select: {
          id: true, code: true, name: true, nameBn: true, credits: true, courseType: true,
          program: { select: { id: true, name: true, nameBn: true } },
          term: { select: { id: true, name: true, nameBn: true } },
        },
      },
      staff: { select: { id: true, name: true, nameBn: true, designation: true } },
      _count: { select: { enrollments: true } },
    },
  });
  return NextResponse.json({ offerings });
}

/** Create an offering: { courseId, sessionYear, section?, staffId?, maxSeats?, note? }. */
export async function POST(req: Request) {
  const session = await requireCampusInstitution();
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  try {
    const body = await req.json();
    const courseId = Number(body.courseId);
    const sessionYear = String(body.sessionYear ?? "").trim();
    if (!Number.isFinite(courseId) || courseId <= 0 || !sessionYear) {
      return NextResponse.json({ error: "Missing fields" }, { status: 400 });
    }
    const course = await prisma.cuCourse.findFirst({
      where: { id: courseId, institutionId: session.institutionId },
      select: { id: true },
    });
    if (!course) return NextResponse.json({ error: "Invalid course" }, { status: 400 });

    const section = String(body.section ?? "").trim();
    const dup = await prisma.cuOffering.findFirst({
      where: { courseId, sessionYear, section: section || null },
      select: { id: true },
    });
    if (dup) return NextResponse.json({ error: "OFFERING_EXISTS" }, { status: 409 });

    const staffId = Number(body.staffId);
    let teacherId: number | null = null;
    if (Number.isFinite(staffId) && staffId > 0) {
      const staff = await prisma.staff.findFirst({
        where: { id: staffId, institutionId: session.institutionId },
        select: { id: true },
      });
      if (!staff) return NextResponse.json({ error: "Invalid teacher" }, { status: 400 });
      teacherId = staff.id;
    }
    const maxSeats = Number(body.maxSeats);
    const seats = Number.isFinite(maxSeats) && maxSeats > 0 ? Math.round(maxSeats) : null;

    const offering = await prisma.cuOffering.create({
      data: {
        institutionId: session.institutionId,
        courseId,
        sessionYear,
        section: section || null,
        staffId: teacherId,
        maxSeats: seats,
        note: String(body.note ?? "").trim() || null,
      },
      include: {
        course: { select: { id: true, code: true, name: true, nameBn: true, credits: true, courseType: true, program: { select: { id: true, name: true, nameBn: true } }, term: { select: { id: true, name: true, nameBn: true } } } },
        staff: { select: { id: true, name: true, nameBn: true, designation: true } },
      },
    });
    return NextResponse.json({ offering });
  } catch {
    return NextResponse.json({ error: "Could not create offering" }, { status: 500 });
  }
}
