// ── API: MCP-server (Model Context Protocol) ─────────────────────────────────
// Eén endpoint waarmee een externe AI (Claude Desktop/Code, Copilot Studio, …)
// via het MCP toegang krijgt tot álle functies van Notary.AI. De tools worden
// gegenereerd uit de OpenAPI-spec (lib/openapi.ts → lib/mcp), zodat elke
// huidige én toekomstige endpoint automatisch beschikbaar is.
//
// Transport: stateless Streamable HTTP (JSON-RPC 2.0 over POST). We antwoorden
// met application/json; servergeïnitieerde streams (SSE via GET) zijn niet
// nodig voor een tools-only server.

import { type NextRequest, NextResponse } from "next/server";
import {
  verwerkBericht,
  type JsonRpcBericht,
  type JsonRpcAntwoord,
} from "@/lib/mcp/protocol";
import { valideerMcpBearer } from "@/lib/auth";

export const runtime = "nodejs";
export const dynamic = "force-dynamic";
// Ruime uitvoeringstijd (Vercel): een tools/call naar een Word-generatie doet
// een GENESTE aanroep van de word-route (tweede serverless-functie, eigen
// koude start van de grote bibliotheek-modulegraaf) + de Supabase-opslag van
// het bestand. De plan-standaard (10-15 s) kapt de MCP-functie dan soms
// mid-flight af — de client (bv. Copilot Studio) ziet enkel "Tool did not
// respond with success", zonder foutbody. 60 s dekt de volledige keten en
// blijft binnen elk Vercel-plan; zie ook de interne fetch-timeout van 60 s
// in lib/mcp/server.ts.
export const maxDuration = 60;

const CORS_HEADERS: Record<string, string> = {
  "Access-Control-Allow-Origin": "*",
  "Access-Control-Allow-Methods": "POST, OPTIONS",
  "Access-Control-Allow-Headers": "Content-Type, Mcp-Session-Id, MCP-Protocol-Version, Authorization",
  "Access-Control-Expose-Headers": "Mcp-Session-Id",
};

export function OPTIONS() {
  return new NextResponse(null, { status: 204, headers: CORS_HEADERS });
}

export async function POST(request: NextRequest) {
  // Optionele Bearer-token-gate: enkel actief wanneer MCP_TOKEN is gezet
  // (anders blijft de endpoint open, zoals voordien).
  if (!valideerMcpBearer(request.headers.get("authorization"))) {
    return NextResponse.json(
      { jsonrpc: "2.0", id: null, error: { code: -32001, message: "Unauthorized: geldig Bearer-token vereist in de Authorization-header." } },
      { status: 401, headers: { ...CORS_HEADERS, "WWW-Authenticate": "Bearer" } },
    );
  }

  let payload: unknown;
  try {
    payload = await request.json();
  } catch {
    return NextResponse.json(
      { jsonrpc: "2.0", id: null, error: { code: -32700, message: "Parse error: ongeldige JSON." } },
      { status: 400, headers: CORS_HEADERS },
    );
  }

  const origin = new URL(request.url).origin;

  // JSON-RPC ondersteunt batches (array) en losse berichten (object).
  const isBatch = Array.isArray(payload);
  const berichten = (isBatch ? payload : [payload]) as JsonRpcBericht[];

  const antwoorden: JsonRpcAntwoord[] = [];
  for (const bericht of berichten) {
    const antwoord = await verwerkBericht(bericht, origin);
    if (antwoord) antwoorden.push(antwoord);
  }

  // Enkel notificaties → geen inhoud (202 Accepted).
  if (antwoorden.length === 0) {
    return new NextResponse(null, { status: 202, headers: CORS_HEADERS });
  }

  const body = isBatch ? antwoorden : antwoorden[0];
  return NextResponse.json(body, { headers: CORS_HEADERS });
}

// SSE-stream (server→client) wordt niet aangeboden: een tools-only server heeft
// geen servergeïnitieerde berichten nodig.
export function GET() {
  return NextResponse.json(
    {
      jsonrpc: "2.0",
      id: null,
      error: { code: -32000, message: "Method Not Allowed: gebruik POST met JSON-RPC 2.0 (MCP)." },
    },
    { status: 405, headers: { ...CORS_HEADERS, Allow: "POST, OPTIONS" } },
  );
}
