import { NextResponse } from "next/server";

import { requireSuperAdmin } from "@/lib/authorization";
import {
  createProcedureRhRecipient,
  listProcedureRhRecipients,
} from "@/services/procedure-rh-recipients.service";
import { procedureRhRecipientCreateSchema } from "@/validators/procedure-rh-recipients";

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

export async function GET(request: Request) {
  const auth = await requireSuperAdmin(request);
  if (!auth.ok) return auth.response;

  const items = await listProcedureRhRecipients(true);
  return NextResponse.json({ items });
}

export async function POST(request: Request) {
  const auth = await requireSuperAdmin(request);
  if (!auth.ok) return auth.response;

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

  try {
    const item = await createProcedureRhRecipient(parsed.data);
    return NextResponse.json(
      { message: "Le destinataire RH a été ajouté.", item },
      { status: 201 },
    );
  } catch (error) {
    if (isUniqueConstraintError(error)) {
      return NextResponse.json(
        { message: "Cette adresse e-mail existe déjà." },
        { status: 409 },
      );
    }
    throw error;
  }
}
