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

/** Central → Pricing: manage the landing-page student-count slabs. */

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

  const tiers = await prisma.pricingTier.findMany({
    orderBy: [{ category: "asc" }, { minStudents: "asc" }, { sortOrder: "asc" }],
  });
  return NextResponse.json({ tiers });
}

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 ?? "");
    if (!PRICING_CATEGORY_BY_CODE[category]) {
      return NextResponse.json({ error: "INVALID_CATEGORY" }, { status: 400 });
    }
    const minStudents = Number(body.minStudents);
    const maxRaw = body.maxStudents === "" || body.maxStudents === null || body.maxStudents === undefined
      ? null
      : Number(body.maxStudents);
    const monthlyPrice = Number(body.monthlyPrice);
    const yearlyDiscount = Number(body.yearlyDiscount ?? 0);

    if (!Number.isFinite(minStudents) || minStudents < 0) {
      return NextResponse.json({ error: "INVALID_RANGE" }, { status: 400 });
    }
    if (maxRaw !== null && (!Number.isFinite(maxRaw) || maxRaw <= minStudents)) {
      return NextResponse.json({ error: "INVALID_RANGE" }, { status: 400 });
    }
    if (!Number.isFinite(monthlyPrice) || monthlyPrice <= 0) {
      return NextResponse.json({ error: "INVALID_PRICE" }, { status: 400 });
    }
    if (!Number.isFinite(yearlyDiscount) || yearlyDiscount < 0 || yearlyDiscount > 90) {
      return NextResponse.json({ error: "INVALID_DISCOUNT" }, { status: 400 });
    }

    const tier = await prisma.pricingTier.create({
      data: {
        category,
        minStudents,
        maxStudents: maxRaw,
        monthlyPrice,
        yearlyDiscount,
        active: body.active !== false,
        sortOrder: Number(body.sortOrder) || 0,
      },
    });
    return NextResponse.json({ tier });
  } catch {
    return NextResponse.json({ error: "Could not create tier" }, { status: 500 });
  }
}
