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

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

  const plans = await prisma.packagePlan.findMany({
    orderBy: [{ institutionType: "asc" }, { price: "asc" }],
    include: {
      _count: { select: { requests: true, subscriptions: true } },
    },
  });
  return NextResponse.json({ plans });
}

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 name = String(body.name ?? "").trim();
    const nameBn = String(body.nameBn ?? "").trim() || name;
    const institutionType = String(body.institutionType ?? "");
    const price = Number(body.price);
    const durationMonths = Number(body.durationMonths) || 12;
    const maxStudents = Number(body.maxStudents);
    const features = String(body.features ?? "")
      .split("\n")
      .map((s) => s.trim())
      .filter(Boolean);
    const featuresBn = String(body.featuresBn ?? "")
      .split("\n")
      .map((s) => s.trim())
      .filter(Boolean);

    if (!name || !Number.isFinite(price) || price <= 0 || !Number.isFinite(maxStudents)) {
      return NextResponse.json({ error: "Invalid package data" }, { status: 400 });
    }
    if (!INSTITUTION_TYPES.includes(institutionType as never)) {
      return NextResponse.json({ error: "Invalid institution type" }, { status: 400 });
    }

    const plan = await prisma.packagePlan.create({
      data: {
        name,
        nameBn,
        institutionType: institutionType as never,
        price,
        durationMonths,
        maxStudents,
        features,
        featuresBn: featuresBn.length ? featuresBn : features,
        educationPattern: body.educationPattern ? String(body.educationPattern) : null,
        billingBasis: body.billingBasis ? String(body.billingBasis) : null,
        ratePerStudent:
          body.ratePerStudent !== undefined && body.ratePerStudent !== null && body.ratePerStudent !== ""
            ? Number(body.ratePerStudent)
            : null,
        yearlyDiscountPct:
          body.yearlyDiscountPct === null || body.yearlyDiscountPct === undefined || body.yearlyDiscountPct === ""
            ? null
            : Number(body.yearlyDiscountPct),
        isActive: true,
      },
    });

    return NextResponse.json({ plan });
  } catch {
    return NextResponse.json({ error: "Could not create package" }, { status: 500 });
  }
}
