import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { requireRole } from "@/lib/auth";
import { pricingCategoriesForInstitution, tierRangeLabel } from "@/lib/pricing";

/** Portal → slab-based packages: the pricing cards this institution may
 *  subscribe under (by type + sector), with every active student range,
 *  the institution's current student count and active range subscription. */
export async function GET() {
  const session = await requireRole("INSTITUTION_ADMIN");
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  const institution = await prisma.institution.findUnique({
    where: { id: session.institutionId },
    select: { type: true, isGovernment: true },
  });
  if (!institution) return NextResponse.json({ error: "Institution not found" }, { status: 404 });

  const eligible = pricingCategoriesForInstitution(institution.type, institution.isGovernment);
  const codes = eligible.map((c) => c.code);

  const [tiers, studentCount, activeSub] = await Promise.all([
    prisma.pricingTier.findMany({
      where: { category: { in: codes }, active: true },
      orderBy: [{ minStudents: "asc" }],
    }),
    prisma.student.count({ where: { institutionId: session.institutionId, status: "ACTIVE" } }),
    prisma.subscription.findFirst({
      where: { institutionId: session.institutionId, status: "ACTIVE", pricingTierId: { not: null } },
      orderBy: { endDate: "desc" },
      include: { pricingTier: true },
    }),
  ]);

  const byCategory = new Map<string, typeof tiers>();
  for (const tier of tiers) {
    const list = byCategory.get(tier.category) ?? [];
    list.push(tier);
    byCategory.set(tier.category, list);
  }

  const categories = eligible
    .map((c) => ({
      ...c,
      tiers: (byCategory.get(c.code) ?? []).map((t) => ({
        id: t.id,
        minStudents: t.minStudents,
        maxStudents: t.maxStudents,
        monthlyPrice: Number(t.monthlyPrice),
        yearlyDiscount: Number(t.yearlyDiscount),
      })),
    }))
    .filter((c) => c.tiers.length > 0);

  return NextResponse.json({
    studentCount,
    categories,
    activeRange: activeSub?.pricingTier
      ? {
          range: tierRangeLabel(activeSub.pricingTier.minStudents, activeSub.pricingTier.maxStudents),
          maxStudents: activeSub.pricingTier.maxStudents,
          endDate: activeSub.endDate,
        }
      : null,
  });
}
