import { NextRequest, NextResponse } from 'next/server';
import { getDb } from '@/lib/db';
import { logError } from '@/lib/error-log';
import { checkRateLimit } from '@/lib/rate-limit';
import { clientErrorSchema, parseBody } from '@/lib/validation';

/**
 * Oeffentlicher Endpoint (bewusst KEINE Admin-Auth) - wird von jedem
 * Nutzer-Browser aufgerufen, sobald dort ein Client-Fehler auftritt (siehe
 * components/error-reporter.tsx fuer globale Fehler und die expliziten
 * logClientError()-Aufrufe in app/session/[code]/page.tsx). Bewusst sehr
 * defensiv implementiert: ein Fehler beim Loggen selbst darf niemals einen
 * weiteren Fehler nach aussen werfen oder den Request scheitern lassen.
 */
export async function POST(req: NextRequest) {
  const limit = checkRateLimit(req, 'client-error', 10, 60);
  if (!limit.allowed) {
    return NextResponse.json({ ok: true }, { status: 429, headers: { 'Retry-After': String(limit.retryAfter) } });
  }

  try {
    const parsed = await parseBody(req, clientErrorSchema);
    if (!parsed.success) return parsed.response;

    const body = parsed.data;
    const db = getDb();
    logError(db, {
      source: 'client',
      message: String(body.message ?? 'Unbekannter Fehler').slice(0, 2000),
      context: body.context
        ? (typeof body.context === 'string' ? body.context : JSON.stringify(body.context)).slice(0, 4000)
        : null,
      url: body.url ? String(body.url).slice(0, 500) : null,
      userAgent: req.headers.get('user-agent'),
      sessionCode: body.sessionCode ? String(body.sessionCode) : null,
    });
  } catch {
    // Fehler-Logging darf selbst niemals einen Fehler nach aussen werfen.
  }
  return NextResponse.json({ ok: true });
}
