import { NextResponse } from "next/server";
import { Prisma } from "@prisma/client";
import { prisma } from "@/lib/prisma";
import { requireRole } from "@/lib/auth";
import { ACADEMIC_CATEGORIES } from "@/lib/constants";

/** Control Panel: module toggles + academic label renaming. */
export async function GET() {
  const session = await requireRole("INSTITUTION_ADMIN");
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  const me = await prisma.institution.findUnique({
    where: { id: session.institutionId },
    select: {
      academicLabels: true,
      enabledModules: true,
      subjectFeeEnabled: true,
      admissionFeeEnabled: true,
      admissionFeeAmount: true,
      trackingEnabled: true,
    },
  });

  return NextResponse.json({
    academicLabels: (me?.academicLabels as Record<string, string> | null) ?? {},
    enabledModules: (me?.enabledModules as string[] | null) ?? null,
    subjectFeeEnabled: me?.subjectFeeEnabled ?? false,
    admissionFeeEnabled: me?.admissionFeeEnabled ?? false,
    admissionFeeAmount: Number(me?.admissionFeeAmount ?? 0),
    trackingEnabled: me?.trackingEnabled ?? false,
  });
}

/** Save module toggles and/or academic label overrides. */
export async function PUT(req: Request) {
  const session = await requireRole("INSTITUTION_ADMIN");
  if (!session || !session.institutionId) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  try {
    const body = await req.json();
    const data: {
      academicLabels?: object;
      enabledModules?: object;
      subjectFeeEnabled?: boolean;
      admissionFeeEnabled?: boolean;
      admissionFeeAmount?: number;
      trackingEnabled?: boolean;
    } = {};

    if (body.academicLabels && typeof body.academicLabels === "object") {
      // keep only non-empty overrides for valid categories
      const cleaned: Record<string, string> = {};
      for (const [key, value] of Object.entries(body.academicLabels as Record<string, unknown>)) {
        const label = String(value ?? "").trim();
        // paired per-locale labels: CLASS (English) + CLASS_BN (Bangla)
        const base = key.endsWith("_BN") ? key.slice(0, -3) : key;
        if (label && (ACADEMIC_CATEGORIES as readonly string[]).includes(base)) {
          cleaned[key] = label.slice(0, 40);
        }
      }
      data.academicLabels = cleaned;
    }

    if (typeof body.subjectFeeEnabled === "boolean") {
      data.subjectFeeEnabled = body.subjectFeeEnabled;
    }

    // admission application fee switch + amount (amount only matters when on)
    if (typeof body.admissionFeeEnabled === "boolean") {
      data.admissionFeeEnabled = body.admissionFeeEnabled;
    }
    if (body.admissionFeeAmount !== undefined && Number.isFinite(Number(body.admissionFeeAmount))) {
      data.admissionFeeAmount = Math.max(0, Number(body.admissionFeeAmount));
    }

    // public application-tracking page switch
    if (typeof body.trackingEnabled === "boolean") {
      data.trackingEnabled = body.trackingEnabled;
    }

    if (Array.isArray(body.enabledModules)) {
      data.enabledModules = body.enabledModules.map((m: unknown) => String(m));
    } else if (body.enabledModules === null) {
      data.enabledModules = Prisma.JsonNull; // clear → all modules on
    }

    await prisma.institution.update({
      where: { id: session.institutionId },
      data,
    });
    return NextResponse.json({ ok: true });
  } catch {
    return NextResponse.json({ error: "Could not save settings" }, { status: 500 });
  }
}
