import { NextRequest, NextResponse } from 'next/server';
import { getDb } from '@/lib/db';
import { getAuthenticatedAdmin } from '@/lib/admin-auth';
import { geocodeCity } from '@/lib/geocode';
import { fetchRestaurantsFromOverpass } from '@/lib/overpass';

// Admin-Suche fuer die Sponsor-Verknuepfung: nutzt dieselbe Geocoding- +
// Overpass-Logik wie der normale Session-Flow (lib/geocode.ts, lib/overpass.ts),
// KEINE eigene Suchimplementierung. Ergebnisse werden per osm_id in
// restaurants upserted - exakt dasselbe Muster wie in
// app/api/session/[code]/restaurants/route.ts.
export async function GET(req: NextRequest) {
  const admin = await getAuthenticatedAdmin();
  if (!admin) return NextResponse.json({ error: 'Nicht autorisiert' }, { status: 401 });

  const city = req.nextUrl.searchParams.get('city')?.trim();
  const radiusParam = Number(req.nextUrl.searchParams.get('radiusKm') || 5);
  const radiusKm = Number.isFinite(radiusParam) ? Math.min(Math.max(radiusParam, 1), 15) : 5;

  if (!city) {
    return NextResponse.json({ error: 'Stadt ist erforderlich' }, { status: 400 });
  }

  const geo = await geocodeCity(city);
  if (!geo) {
    return NextResponse.json({ error: 'Ort nicht gefunden' }, { status: 404 });
  }

  let overpassResults;
  try {
    overpassResults = await fetchRestaurantsFromOverpass(geo.lat, geo.lon, radiusKm * 1000);
  } catch (e) {
    console.error('Overpass-Suche (Admin) fehlgeschlagen:', e);
    return NextResponse.json({ error: 'Restaurant-Suche fehlgeschlagen, bitte erneut versuchen' }, { status: 502 });
  }

  const db = getDb();
  const upsertStmt = db.prepare(`
    INSERT INTO restaurants
      (osm_id, name, lat, lon, address, postal_code, suburb, cuisine, price_rating, is_fast_food, phone, website,
       opening_hours_raw, diet_vegan, diet_vegetarian, diet_halal, diet_gluten_free)
    VALUES (@osmId, @name, @lat, @lon, @address, @postalCode, @suburb, @cuisine, @priceRating, @isFastFood, @phone, @website,
       @openingHoursRaw, @dietVegan, @dietVegetarian, @dietHalal, @dietGlutenFree)
    ON CONFLICT(osm_id) DO UPDATE SET
      name = excluded.name, cuisine = excluded.cuisine, price_rating = excluded.price_rating,
      address = excluded.address, postal_code = excluded.postal_code, suburb = excluded.suburb,
      phone = excluded.phone, website = excluded.website, opening_hours_raw = excluded.opening_hours_raw,
      diet_vegan = excluded.diet_vegan, diet_vegetarian = excluded.diet_vegetarian,
      diet_halal = excluded.diet_halal, diet_gluten_free = excluded.diet_gluten_free,
      updated_at = datetime('now')
    RETURNING id
  `);

  // NEU: phone/website/openingHoursRaw werden jetzt mit zurueckgegeben, damit
  // das Admin-Formular sie beim Verknuepfen automatisch uebernehmen kann.
  // Vorher wurden sie zwar in restaurants gespeichert, aber nie in der
  // API-Antwort mitgeliefert.
  // Limit erhöht von 40 auf 200, damit Admin nicht mehr "zufällig" Restaurants übersieht.
  // Frontend hat Client-seitigen Name-Filter, um Ergebnisse zu durchsuchen.
  const results = overpassResults.slice(0, 200).map((r) => {
    const row = upsertStmt.get({
      ...r,
      isFastFood: r.isFastFood ? 1 : 0,
      dietVegan: r.dietVegan ?? null,
      dietVegetarian: r.dietVegetarian ?? null,
      dietHalal: r.dietHalal ?? null,
      dietGlutenFree: r.dietGlutenFree ?? null,
    }) as { id: number } | undefined;

    return {
      restaurantId: row?.id ?? null,
      name: r.name,
      address: r.address ?? null,
      postalCode: r.postalCode ?? null,
      suburb: r.suburb ?? null,
      lat: r.lat,
      lon: r.lon,
      cuisine: r.cuisine ?? null,
      phone: r.phone ?? null,
      website: r.website ?? null,
      openingHoursRaw: r.openingHoursRaw ?? null,
    };
  }).filter((r) => r.restaurantId !== null);

  return NextResponse.json({ results, geocoded: geo.displayName });
}
