import { NextResponse } from "next/server";

import {
  employeeScopeFromAccess,
  requirePermission,
} from "@/lib/authorization";
import {
  buildDynamicDocumentDraft,
  DynamicDocumentError,
} from "@/services/documents-modeles-generation.service";
import { dynamicDocumentQuerySchema } 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 GET(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 url = new URL(request.url);
  const parsed = dynamicDocumentQuerySchema.safeParse({
    cos: url.searchParams.get("cos"),
    signataireId: url.searchParams.get("signataireId"),
  });
  if (!Number.isInteger(templateId) || templateId <= 0 || !parsed.success) {
    return NextResponse.json({ message: "Invalid query parameters" }, { status: 400 });
  }

  try {
    return NextResponse.json(
      await buildDynamicDocumentDraft({
        templateId,
        cos: parsed.data.cos,
        signataireId: parsed.data.signataireId,
        scope: employeeScopeFromAccess(auth.access),
      }),
    );
  } catch (error) {
    if (error instanceof DynamicDocumentError) return errorResponse(error);
    console.error("Erreur lors de la préparation du modèle", error);
    return NextResponse.json({ message: "Document draft loading failed" }, { status: 500 });
  }
}
