import { NextResponse } from "next/server";

import {
  employeeScopeFromAccess,
  requirePermission,
} from "@/lib/authorization";
import {
  buildAttestationEmploiPdfDraft,
  buildAttestationMutuellePdfDraft,
  buildAttestationProlongationMutuellePdfDraft,
  buildAutorisationPrefecturePdfDraft,
  DocumentGenerationError,
} from "@/services/impressions.service";

export const runtime = "nodejs";

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

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

  const { document } = await params;
  const url = new URL(request.url);
  const cos = Number(url.searchParams.get("cos"));
  const signataireId = Number(url.searchParams.get("signataireId"));

  if (
    !Number.isInteger(cos) ||
    cos <= 0 ||
    !Number.isInteger(signataireId) ||
    signataireId <= 0
  ) {
    return NextResponse.json(
      { message: "Invalid query parameters" },
      { status: 400 },
    );
  }

  const scope = employeeScopeFromAccess(auth.access);

  try {
    let data: unknown;
    switch (document) {
      case "attestation-emploi":
        data = await buildAttestationEmploiPdfDraft(cos, signataireId, scope);
        break;
      case "attestation-mutuelle":
        data = await buildAttestationMutuellePdfDraft(cos, signataireId, scope);
        break;
      case "attestation-prolongation-mutuelle":
        data = await buildAttestationProlongationMutuellePdfDraft(
          cos,
          signataireId,
          scope,
        );
        break;
      case "autorisation-prefecture":
        data = await buildAutorisationPrefecturePdfDraft(
          cos,
          signataireId,
          scope,
        );
        break;
      default:
        return NextResponse.json({ message: "Unknown document" }, { status: 404 });
    }

    return NextResponse.json({ data });
  } 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 du chargement du document ${document}`, error);
    return NextResponse.json(
      { message: "Document draft loading failed" },
      { status: 500 },
    );
  }
}
