import { NextResponse } from "next/server";

import {
  employeeScopeFromAccess,
  requirePermission,
} from "@/lib/authorization";
import { getEmployeByCos } from "@/services/employes.service";
import { generateProcedurePdf } from "@/services/procedures-pdf.service";
import { getProcedureById } from "@/services/procedures.service";

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

export async function GET(request: Request, { params }: RouteContext) {
  const auth = await requirePermission(request, "autres", "read");
  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 item = await getProcedureById(id);
  if (!item) {
    return NextResponse.json({ message: "Demande introuvable" }, { status: 404 });
  }

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

  const pdf = await generateProcedurePdf(item);
  const name = [item.employee.NSA, item.employee.PRE]
    .filter(Boolean)
    .join("-")
    .replace(/[^a-zA-Z0-9-]+/g, "-");

  return new NextResponse(new Uint8Array(pdf), {
    headers: {
      "Content-Type": "application/pdf",
      "Content-Disposition": `attachment; filename="demande-procedure-${name || item.employee_cos}-${item.id}.pdf"`,
      "Cache-Control": "no-store",
    },
  });
}
