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

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

/** Catalog items with their link state for one institution. */
export async function GET(_req: Request, { params }: Params) {
  const session = await requireRole("SUPER_ADMIN");
  if (!session) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });

  const { id } = await params;
  const institution = await prisma.institution.findUnique({
    where: { id: Number(id) },
    select: { id: true, name: true, parentId: true },
  });
  if (!institution) return NextResponse.json({ error: "Not found" }, { status: 404 });

  const items = await prisma.academicItem.findMany({
    where: { isActive: true },
    orderBy: [{ category: "asc" }, { id: "asc" }],
    include: { institution: { select: { id: true, name: true } } },
  });

  return NextResponse.json({
    institution,
    items: items.map((i) => ({
      id: i.id,
      category: i.category,
      name: i.name,
      nameBn: i.nameBn,
      linked: i.institutionId === institution.id,
      ownerName: i.institutionId ? i.institution?.name ?? null : null,
    })),
  });
}

/** Set the institution's linked items: { itemIds: number[] }.
   Items previously linked to this institution but unchecked become global. */
export async function PUT(req: Request, { params }: Params) {
  const session = await requireRole("SUPER_ADMIN");
  if (!session) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });

  const { id } = await params;
  const institutionId = Number(id);
  const institution = await prisma.institution.findUnique({
    where: { id: institutionId },
    select: { id: true },
  });
  if (!institution) return NextResponse.json({ error: "Not found" }, { status: 404 });

  try {
    const body = await req.json();
    const itemIds: number[] = Array.isArray(body.itemIds)
      ? body.itemIds.map((x: unknown) => Number(x)).filter(Boolean)
      : [];

    const items = await prisma.academicItem.findMany({
      where: { id: { in: itemIds }, isActive: true },
      select: { id: true },
    });

    await prisma.$transaction([
      // Unlink items this institution owned but that were unchecked
      prisma.academicItem.updateMany({
        where: { institutionId, id: { notIn: items.map((i) => i.id) } },
        data: { institutionId: null },
      }),
      // Link the checked items (reassigning from another owner is allowed)
      prisma.academicItem.updateMany({
        where: { id: { in: items.map((i) => i.id) } },
        data: { institutionId },
      }),
      // Linked items are auto-selected for the institution's portal
      prisma.academicSelection.createMany({
        data: items.map((i) => ({ institutionId, academicItemId: i.id })),
        skipDuplicates: true,
      }),
    ]);

    return NextResponse.json({ success: true, linked: items.length });
  } catch {
    return NextResponse.json({ error: "Could not update linked classes" }, { status: 500 });
  }
}
