import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
import { logSystem } from "@/lib/systemLog";
import { getSessionClientId } from "@/lib/auth";

// error.tsx meldet clientseitige Render-/Hydration-Fehler hierher. Bewusst
// ohne Auth — Fehler passieren auch abgemeldet — dafür knapp begrenzt und
// gekappt, damit eine kaputte Client-Schleife das Log nicht flutet.
const hits = new Map<string, { count: number; resetAt: number }>();
const WINDOW_MS = 60_000;
const MAX_PER_WINDOW = 30;

function rateLimited(ip: string) {
  const now = Date.now();
  if (hits.size > 500) {
    for (const [k, v] of hits) if (now > v.resetAt) hits.delete(k);
  }
  const entry = hits.get(ip);
  if (!entry || now > entry.resetAt) {
    hits.set(ip, { count: 1, resetAt: now + WINDOW_MS });
    return false;
  }
  entry.count += 1;
  return entry.count > MAX_PER_WINDOW;
}

export async function POST(request: NextRequest) {
  const ip = request.headers.get("x-forwarded-for")?.split(",")[0]?.trim() || "unbekannt";
  if (rateLimited(ip)) return NextResponse.json({ ok: false }, { status: 429 });

  const body = await request.json().catch(() => null);
  if (!body || typeof body.message !== "string") {
    return NextResponse.json({ ok: false }, { status: 400 });
  }

  const actorId = await getSessionClientId().catch(() => null);

  await logSystem({
    level: "error",
    source: "client",
    message: body.message.slice(0, 2000),
    stack: typeof body.stack === "string" ? body.stack.slice(0, 12000) : "",
    digest: typeof body.digest === "string" ? body.digest.slice(0, 120) : "",
    route: typeof body.path === "string" ? body.path.slice(0, 400) : "",
    method: "CLIENT",
    actorId: actorId || null,
    context: {
      userAgent: request.headers.get("user-agent") || "",
      referer: request.headers.get("referer") || "",
    },
  });

  return NextResponse.json({ ok: true });
}
