import { NextResponse } from "next/server";

import {
  employeeScopeFromAccess,
  requirePermission,
} from "@/lib/authorization";
import {
  buildAttestationImpotsPdfDraft,
  DocumentGenerationError,
} from "@/services/impressions.service";

export const runtime = "nodejs";

function errorResponse(error: DocumentGenerationError) {
  if (error.code === "EMPLOYE_NOT_FOUND") {
    return NextResponse.json({ message: "Employe not found" }, { status: 404 });
  }

  if (error.code === "CONTRACT_NOT_FOUND") {
    return NextResponse.json(
      { message: "No contract found for this employee" },
      { status: 409 },
    );
  }

  return NextResponse.json(
    { message: "Active signataire not found" },
    { status: 404 },
  );
}

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

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

  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 },
    );
  }

  try {
    const data = await buildAttestationImpotsPdfDraft(
      cos,
      signataireId,
      employeeScopeFromAccess(auth.access),
    );

    return NextResponse.json({ data });
  } catch (error: unknown) {
    if (error instanceof DocumentGenerationError) return errorResponse(error);

    console.error("Erreur lors du chargement de l'attestation impôts", error);
    return NextResponse.json(
      { message: "Document draft loading failed" },
      { status: 500 },
    );
  }
}
