import { NextResponse } from "next/server";

import {
  employeeScopeFromAccess,
  requirePermission,
} from "@/lib/authorization";
import { renderAttestationImpotsPdf } from "@/services/attestation-impots-pdf.service";
import {
  buildAttestationImpotsPdfDraft,
  DocumentGenerationError,
} from "@/services/impressions.service";
import { attestationImpotsPdfSchema } from "@/validators/impressions";

export const runtime = "nodejs";

export async function POST(request: Request) {
  const auth = await requirePermission(request, "impressions", "read");

  if (!auth.ok) return auth.response;

  let body: unknown;

  try {
    body = await request.json();
  } catch {
    return NextResponse.json({ message: "Invalid JSON body" }, { status: 400 });
  }

  const parsed = attestationImpotsPdfSchema.safeParse(body);

  if (!parsed.success) {
    return NextResponse.json(
      { message: "Invalid document data", issues: parsed.error.issues },
      { status: 422 },
    );
  }

  try {
    await buildAttestationImpotsPdfDraft(
      parsed.data.cos,
      parsed.data.signataireId,
      employeeScopeFromAccess(auth.access),
    );
    const pdf = await renderAttestationImpotsPdf(parsed.data.data);
    const filename = `attestation-impots-${parsed.data.cos}.pdf`;

    return new NextResponse(new Uint8Array(pdf), {
      status: 200,
      headers: {
        "Content-Type": "application/pdf",
        "Content-Disposition": `inline; filename="${filename}"`,
        "Cache-Control": "private, no-store",
      },
    });
  } catch (error: unknown) {
    if (error instanceof DocumentGenerationError) {
      const status = error.code === "CONTRACT_NOT_FOUND" ? 409 : 404;
      return NextResponse.json({ message: error.code }, { status });
    }

    console.error("Erreur lors de la génération PDF", error);
    return NextResponse.json(
      { message: "PDF generation failed" },
      { status: 500 },
    );
  }
}
