import { NextResponse } from "next/server";

import { requireSuperAdmin } from "@/lib/authorization";
import { updateProcedureRhRecipient } from "@/services/procedure-rh-recipients.service";
import { procedureRhRecipientUpdateSchema } from "@/validators/procedure-rh-recipients";

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

function isKnownPrismaError(error: unknown, code: string) {
  return (
    typeof error === "object" &&
    error !== null &&
    "code" in error &&
    error.code === code
  );
}

export async function PUT(request: Request, { params }: RouteContext) {
  const auth = await requireSuperAdmin(request);
  if (!auth.ok) return auth.response;

  const id = Number((await params).id);
  if (!Number.isInteger(id) || id <= 0) {
    return NextResponse.json({ message: "Identifiant invalide" }, { status: 400 });
  }

  const parsed = procedureRhRecipientUpdateSchema.safeParse(
    await request.json().catch(() => null),
  );
  if (!parsed.success) {
    return NextResponse.json(
      { message: "Modification invalide", issues: parsed.error.issues },
      { status: 400 },
    );
  }

  try {
    const item = await updateProcedureRhRecipient(id, parsed.data);
    return NextResponse.json({ message: "Le destinataire RH a été modifié.", item });
  } catch (error) {
    if (isKnownPrismaError(error, "P2025")) {
      return NextResponse.json({ message: "Destinataire introuvable" }, { status: 404 });
    }
    if (isKnownPrismaError(error, "P2002")) {
      return NextResponse.json(
        { message: "Cette adresse e-mail existe déjà." },
        { status: 409 },
      );
    }
    throw error;
  }
}
