import { NextResponse } from "next/server";

import { requirePermission } from "@/lib/authorization";
import {
  activateDocumentTemplate,
  DocumentTemplateError,
  importDocumentTemplate,
  listDocumentTemplates,
} from "@/services/modeles-documents.service";
import {
  documentTemplateActivationSchema,
  documentTemplateMetadataSchema,
} from "@/validators/modeles-documents";

export const runtime = "nodejs";

function templateError(error: DocumentTemplateError) {
  const status = error.code.endsWith("NOT_FOUND")
    ? 404
    : error.code === "CODE_EXISTS"
      ? 409
      : 422;
  return NextResponse.json({ message: error.code }, { status });
}

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

  return NextResponse.json({ items: await listDocumentTemplates() });
}

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

  let form: FormData;
  try {
    form = await request.formData();
  } catch {
    return NextResponse.json({ message: "Invalid multipart body" }, { status: 400 });
  }

  const file = form.get("file");
  if (!(file instanceof File)) {
    return NextResponse.json({ message: "DOCX_REQUIRED" }, { status: 400 });
  }

  const metadata = documentTemplateMetadataSchema.safeParse({
    templateId: form.get("templateId") || undefined,
    code: form.get("code"),
    libelle: form.get("libelle"),
    description: form.get("description") || "",
    categorie: form.get("categorie"),
    etablissement: form.get("etablissement") || "",
  });
  if (!metadata.success) {
    return NextResponse.json(
      { message: "INVALID_METADATA", issues: metadata.error.issues },
      { status: 422 },
    );
  }

  try {
    const item = await importDocumentTemplate({ ...metadata.data, file });
    return NextResponse.json({ item }, { status: 201 });
  } catch (error) {
    if (error instanceof DocumentTemplateError) return templateError(error);
    console.error("Document template import failed", error);
    return NextResponse.json({ message: "IMPORT_FAILED" }, { status: 500 });
  }
}

export async function PATCH(request: Request) {
  const auth = await requirePermission(request, "impressions", "write");
  if (!auth.ok) return auth.response;

  const parsed = documentTemplateActivationSchema.safeParse(
    await request.json().catch(() => null),
  );
  if (!parsed.success) {
    return NextResponse.json({ message: "INVALID_BODY" }, { status: 422 });
  }

  try {
    const item = await activateDocumentTemplate(parsed.data);
    return NextResponse.json({ item });
  } catch (error) {
    if (error instanceof DocumentTemplateError) return templateError(error);
    console.error("Document template activation failed", error);
    return NextResponse.json({ message: "ACTIVATION_FAILED" }, { status: 500 });
  }
}
