import { NextResponse } from "next/server";

import {
  employeeScopeFromAccess,
  requirePermission,
} from "@/lib/authorization";
import {
  DynamicDocumentError,
  generateDynamicDocument,
} from "@/services/documents-modeles-generation.service";
import { dynamicDocumentGenerationSchema } from "@/validators/documents-modeles-generation";

export const runtime = "nodejs";
type RouteContext = { params: Promise<{ id: string }> };

function errorResponse(error: DynamicDocumentError) {
  const status = error.code === "TEMPLATE_NOT_FOUND" || error.code === "EMPLOYE_NOT_FOUND"
    ? 404
    : error.code === "SIGNATAIRE_NOT_FOUND"
      ? 409
      : 422;
  return NextResponse.json(
    { message: error.code, missingFields: error.missingFields },
    { status },
  );
}

export async function POST(request: Request, { params }: RouteContext) {
  const auth = await requirePermission(request, "impressions", "read");
  if (!auth.ok) return auth.response;

  const { id } = await params;
  const templateId = Number(id);
  const format = new URL(request.url).searchParams.get("format");
  if (!Number.isInteger(templateId) || templateId <= 0 || !["docx", "pdf"].includes(format ?? "")) {
    return NextResponse.json({ message: "Invalid route parameters" }, { status: 400 });
  }

  let body: unknown;
  try {
    body = await request.json();
  } catch {
    return NextResponse.json({ message: "Invalid JSON body" }, { status: 400 });
  }
  const parsed = dynamicDocumentGenerationSchema.safeParse(body);
  if (!parsed.success) {
    return NextResponse.json(
      { message: "Invalid document data", issues: parsed.error.issues },
      { status: 422 },
    );
  }

  try {
    const generated = await generateDynamicDocument({
      templateId,
      cos: parsed.data.cos,
      signataireId: parsed.data.signataireId,
      scope: employeeScopeFromAccess(auth.access),
      values: parsed.data.values,
      format: format as "docx" | "pdf",
    });
    const isPdf = format === "pdf";
    return new NextResponse(new Uint8Array(generated.buffer), {
      status: 200,
      headers: {
        "Content-Type": isPdf
          ? "application/pdf"
          : "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        "Content-Disposition": `${isPdf ? "inline" : "attachment"}; filename="${generated.filename}.${format}"`,
        "Cache-Control": "private, no-store",
      },
    });
  } catch (error) {
    if (error instanceof DynamicDocumentError) return errorResponse(error);
    console.error("Erreur lors de la génération du modèle", error);
    return NextResponse.json({ message: "Document generation failed" }, { status: 500 });
  }
}
