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

type Params = { params: Promise<{ id: string }> };

/** Update a term. */
export async function PATCH(req: Request, { params }: Params) {
  const session = await requireCampusInstitution();
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  const { id } = await params;
  const term = await prisma.cuTerm.findFirst({
    where: { id: Number(id), institutionId: session.institutionId },
    select: { id: true, programId: true, sequence: true },
  });
  if (!term) return NextResponse.json({ error: "Not found" }, { status: 404 });

  try {
    const body = await req.json();
    const data: Record<string, unknown> = {};
    if (body.name !== undefined) data.name = String(body.name).trim();
    if (body.nameBn !== undefined) data.nameBn = String(body.nameBn).trim() || null;
    if (body.sequence !== undefined) {
      const seq = Number(body.sequence);
      if (Number.isFinite(seq) && seq > 0) {
        if (seq !== term.sequence) {
          const dup = await prisma.cuTerm.findFirst({
            where: { programId: term.programId, sequence: seq, id: { not: term.id } },
            select: { id: true },
          });
          if (dup) return NextResponse.json({ error: "SEQUENCE_EXISTS" }, { status: 409 });
        }
        data.sequence = Math.round(seq);
      }
    }
    for (const key of ["startDate", "endDate"] as const) {
      if (body[key] !== undefined) {
        const s = String(body[key]).slice(0, 10);
        data[key] = /^\d{4}-\d{2}-\d{2}$/.test(s) ? new Date(`${s}T00:00:00Z`) : null;
      }
    }
    if (body.note !== undefined) data.note = String(body.note).trim() || null;

    const updated = await prisma.cuTerm.update({
      where: { id: term.id },
      data,
      include: { program: { select: { id: true, name: true, nameBn: true } } },
    });
    return NextResponse.json({ term: updated });
  } catch {
    return NextResponse.json({ error: "Could not update term" }, { status: 500 });
  }
}

/** Delete a term — blocked while it still has courses or exams attached. */
export async function DELETE(_req: Request, { params }: Params) {
  const session = await requireCampusInstitution();
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  const { id } = await params;
  const term = await prisma.cuTerm.findFirst({
    where: { id: Number(id), institutionId: session.institutionId },
    select: { id: true, _count: { select: { courses: true, exams: true } } },
  });
  if (!term) return NextResponse.json({ error: "Not found" }, { status: 404 });
  if (term._count.courses > 0 || term._count.exams > 0) {
    return NextResponse.json({ error: "TERM_IN_USE" }, { status: 409 });
  }

  try {
    await prisma.cuTerm.delete({ where: { id: term.id } });
    return NextResponse.json({ ok: true });
  } catch {
    return NextResponse.json({ error: "Could not delete term" }, { status: 500 });
  }
}
