import { NextResponse } from "next/server";

import {
  employeeScopeFromAccess,
  requirePermission,
} from "@/lib/authorization";
import { getEmployeByCos } from "@/services/employes.service";
import { getActiveProcedureRhRecipient } from "@/services/procedure-rh-recipients.service";
import { sendProcedureToRh } from "@/services/procedure-rh-email.service";
import { getProcedureById } from "@/services/procedures.service";
import { procedureRhSendSchema } from "@/validators/procedure-rh-recipients";

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

export async function POST(request: Request, { params }: RouteContext) {
  const auth = await requirePermission(request, "autres", "write");
  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 = procedureRhSendSchema.safeParse(
    await request.json().catch(() => null),
  );
  if (!parsed.success) {
    return NextResponse.json(
      { message: "Destinataire invalide", issues: parsed.error.issues },
      { status: 400 },
    );
  }

  const procedure = await getProcedureById(id);
  if (!procedure) {
    return NextResponse.json({ message: "Demande introuvable" }, { status: 404 });
  }

  const employee = await getEmployeByCos(
    procedure.employee_cos,
    employeeScopeFromAccess(auth.access),
  );
  if (!employee) {
    return NextResponse.json({ message: "Demande introuvable" }, { status: 404 });
  }

  const recipient = await getActiveProcedureRhRecipient(parsed.data.recipientId);
  if (!recipient) {
    return NextResponse.json(
      { message: "Ce destinataire RH est introuvable ou désactivé." },
      { status: 400 },
    );
  }

  try {
    const result = await sendProcedureToRh({
      procedure,
      recipient,
      senderUserId: auth.principal.id,
      senderName: auth.principal.username,
      senderEmail: auth.principal.email,
    });
    return NextResponse.json(
      { message: `La demande a été envoyée à ${recipient.label}.`, item: result },
      { status: 201 },
    );
  } catch {
    return NextResponse.json(
      { message: "La demande n’a pas pu être envoyée. Vérifiez la configuration Graph." },
      { status: 502 },
    );
  }
}
