import { NextResponse } from "next/server";
import { z } from "zod";
import { apiAuth } from "@/lib/auth/guards";
import { geocodeAddress } from "@/lib/geo/nominatim";
import { nonEmptyText } from "@/lib/validation/common";

// Geo-Geocoding-Endpunkt. Default-deny: jede Anfrage durchläuft zuerst den
// API-Guard (401 ohne Session). Reine Geokodierung, kein DB-Schreibzugriff.
export const dynamic = "force-dynamic";

const bodySchema = z.object({ address: nonEmptyText });

export async function POST(req: Request) {
  const authResult = await apiAuth();
  if (!authResult.ok) return authResult.response;

  let raw: unknown;
  try {
    raw = await req.json();
  } catch {
    return NextResponse.json({ error: "Ungültiger Anfragekörper." }, { status: 400 });
  }

  const parsed = bodySchema.safeParse(raw);
  if (!parsed.success) {
    return NextResponse.json(
      { error: "Adresse fehlt oder ist ungültig." },
      { status: 400 },
    );
  }

  const result = await geocodeAddress(parsed.data.address);
  if (result.status === "not_found") {
    return NextResponse.json({ error: "Adresse nicht gefunden." }, { status: 404 });
  }
  if (result.status === "error") {
    // Kein Fachdaten-Leak: generische Meldung, Detail nur im Server-Log.
    console.error("Geocoding-Fehler:", result.reason);
    return NextResponse.json(
      { error: "Geokodierung derzeit nicht verfügbar." },
      { status: 502 },
    );
  }

  return NextResponse.json({
    coords: result.coords,
    displayName: result.displayName,
  });
}
