import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { requireRole } from "@/lib/auth";
import { resetReferralCode } from "@/lib/referral";

type Params = { params: Promise<{ id: string }> };

/** Update institution status, flip the government-sector flag, edit the
    Bangladesh education-registry info (EIIN, board, MPO…), or manage the
    institution's referral code (central credential). */
export async function PATCH(req: Request, { params }: Params) {
  const session = await requireRole("SUPER_ADMIN");
  if (!session) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });

  const { id } = await params;
  const institutionId = Number(id);
  const body = await req.json().catch(() => ({}));

  try {
    // referral code management: { referralCode: "CUSTOM-CODE" | "RESET" }
    if (body.referralCode !== undefined) {
      const raw = String(body.referralCode ?? "").trim().toUpperCase();
      if (raw === "RESET") {
        const code = await resetReferralCode(institutionId);
        const institution = await prisma.institution.findUnique({
          where: { id: institutionId },
          select: { id: true, name: true, referralCode: true },
        });
        return NextResponse.json({ institution, code });
      }
      if (!/^[A-Z0-9][A-Z0-9-]{3,19}$/.test(raw)) {
        return NextResponse.json({ error: "REFERRAL_FORMAT" }, { status: 400 });
      }
      const taken = await prisma.institution.findUnique({
        where: { referralCode: raw },
        select: { id: true },
      });
      if (taken && taken.id !== institutionId) {
        return NextResponse.json({ error: "REFERRAL_TAKEN" }, { status: 409 });
      }
      const institution = await prisma.institution.update({
        where: { id: institutionId },
        data: { referralCode: raw },
        select: { id: true, name: true, referralCode: true },
      });
      return NextResponse.json({ institution, code: raw });
    }

    if (typeof body.isGovernment === "boolean") {
      const institution = await prisma.institution.update({
        where: { id: Number(id) },
        data: { isGovernment: body.isGovernment },
      });
      return NextResponse.json({ institution });
    }

    // Bangladesh education-registry identifiers (Institution Info edit)
    if (body.info && typeof body.info === "object") {
      const info = body.info as Record<string, unknown>;
      const institution = await prisma.institution.update({
        where: { id: Number(id) },
        data: {
          eiin: String(info.eiin ?? "").trim() || null,
          ein: String(info.ein ?? "").trim() || null,
          mpoCode: String(info.mpoCode ?? "").trim() || null,
          boardCode: String(info.boardCode ?? "").trim() || null,
          educationBoard: String(info.educationBoard ?? "").trim() || null,
          establishedYear: Number(info.establishedYear) || null,
          postCode: String(info.postCode ?? "").trim() || null,
        },
      });
      return NextResponse.json({ institution });
    }

    const status = String(body.status ?? "");
    if (!["PENDING", "ACTIVE", "SUSPENDED"].includes(status)) {
      return NextResponse.json({ error: "Invalid status" }, { status: 400 });
    }

    const institution = await prisma.institution.update({
      where: { id: Number(id) },
      data: { status: status as never },
    });
    return NextResponse.json({ institution });
  } catch {
    return NextResponse.json({ error: "Could not update institution" }, { status: 500 });
  }
}
