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

/** Academic terms (year/semester) — optionally filtered by ?programId=. */
export async function GET(req: Request) {
  const session = await requireCampusInstitution();
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  const programId = Number(new URL(req.url).searchParams.get("programId"));
  const terms = await prisma.cuTerm.findMany({
    where: {
      institutionId: session.institutionId,
      ...(Number.isFinite(programId) && programId > 0 ? { programId } : {}),
    },
    orderBy: [{ programId: "asc" }, { sequence: "asc" }],
    include: { program: { select: { id: true, name: true, nameBn: true } }, _count: { select: { courses: true, exams: true, students: true } } },
  });
  return NextResponse.json({ terms });
}

/** Create a term: { programId, name, nameBn?, sequence, startDate?, endDate?, 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 programId = Number(body.programId);
    const name = String(body.name ?? "").trim();
    const sequence = Number(body.sequence);
    if (!Number.isFinite(programId) || programId <= 0 || !name || !Number.isFinite(sequence) || sequence <= 0) {
      return NextResponse.json({ error: "Missing fields" }, { status: 400 });
    }
    const program = await prisma.cuProgram.findFirst({
      where: { id: programId, institutionId: session.institutionId },
      select: { id: true },
    });
    if (!program) return NextResponse.json({ error: "Invalid program" }, { status: 400 });

    const dup = await prisma.cuTerm.findFirst({
      where: { programId, sequence },
      select: { id: true },
    });
    if (dup) return NextResponse.json({ error: "SEQUENCE_EXISTS" }, { status: 409 });

    const date = (v: unknown) => {
      const s = String(v ?? "").slice(0, 10);
      return /^\d{4}-\d{2}-\d{2}$/.test(s) ? new Date(`${s}T00:00:00Z`) : null;
    };

    const term = await prisma.cuTerm.create({
      data: {
        institutionId: session.institutionId,
        programId,
        name,
        nameBn: String(body.nameBn ?? "").trim() || null,
        sequence: Math.round(sequence),
        startDate: date(body.startDate),
        endDate: date(body.endDate),
        note: String(body.note ?? "").trim() || null,
      },
      include: { program: { select: { id: true, name: true, nameBn: true } } },
    });
    return NextResponse.json({ term });
  } catch {
    return NextResponse.json({ error: "Could not create term" }, { status: 500 });
  }
}
