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

export async function GET(req: Request) {
  const session = await requireRole("SUPER_ADMIN");
  if (!session) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });

  const url = new URL(req.url);
  const category = url.searchParams.get("category");

  const where = category && ACADEMIC_CATEGORIES.includes(category as never)
    ? { category: category as never }
    : {};

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

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

export async function POST(req: Request) {
  const session = await requireRole("SUPER_ADMIN");
  if (!session) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });

  try {
    const body = await req.json();
    const category = String(body.category ?? "");
    const name = String(body.name ?? "").trim();
    const nameBn = String(body.nameBn ?? "").trim() || name;

    if (!name || !ACADEMIC_CATEGORIES.includes(category as never)) {
      return NextResponse.json({ error: "Invalid item data" }, { status: 400 });
    }

    // Optional owner: link the item to one institution (branch classes)
    const ownerInstitutionId = body.institutionId ? Number(body.institutionId) : null;
    if (ownerInstitutionId) {
      const owner = await prisma.institution.findUnique({ where: { id: ownerInstitutionId } });
      if (!owner) return NextResponse.json({ error: "Owner not found" }, { status: 404 });
    }

    // Items must be unique within (category, name, owner)
    const existing = await prisma.academicItem.findFirst({
      where: { category: category as never, name, institutionId: ownerInstitutionId },
    });
    if (existing) {
      return NextResponse.json({ error: "ITEM_EXISTS" }, { status: 409 });
    }

    const item = await prisma.academicItem.create({
      data: {
        category: category as never,
        name,
        nameBn,
        code: String(body.code ?? "").trim() || null,
        institutionId: ownerInstitutionId,
        // Institution-owned items are auto-selected for their owner
        ...(ownerInstitutionId
          ? { selections: { create: { institutionId: ownerInstitutionId } } }
          : {}),
      },
    });
    return NextResponse.json({ item });
  } catch {
    return NextResponse.json({ error: "Could not create item" }, { status: 500 });
  }
}
