import { NextRequest, NextResponse } from 'next/server';
import { getDb } from '@/lib/db';

export async function GET(req: NextRequest, { params }: { params: Promise<{ code: string }> }) {
  const { code } = await params;
  const db = getDb();
  const session = db.prepare('SELECT * FROM sessions WHERE code = ?').get(code);
  if (!session) {
    return NextResponse.json({ error: 'Session nicht gefunden' }, { status: 404 });
  }

  const sessionId = (session as any).id;

  // Heartbeat: haelt last_activity_at aktuell, damit das Admin-Dashboard
  // "echte" Live-Sessions von bloss nicht-abgelaufenen unterscheiden kann.
  // Gedrosselt auf max. alle 30s pro Session, damit der 2s-Poll nicht bei
  // jedem Tick eine Schreib-Transaktion ausloest.
  db.prepare(
    `UPDATE sessions SET last_activity_at = datetime('now')
     WHERE id = ? AND (last_activity_at IS NULL OR last_activity_at < datetime('now', '-30 seconds'))`
  ).run(sessionId);

  // Teilnehmer-Heartbeat: identifiziert den pollenden Teilnehmer ueber den
  // Query-Param, damit das Admin-Dashboard "aktive Nutzer" zaehlen kann.
  const participantIdRaw = req.nextUrl.searchParams.get('participantId');
  if (participantIdRaw) {
    const participantId = Number(participantIdRaw);
    if (Number.isInteger(participantId) && participantId > 0) {
      db.prepare(
        `UPDATE participants SET last_seen_at = datetime('now')
         WHERE id = ? AND session_id = ? AND is_active = 1
           AND (last_seen_at IS NULL OR last_seen_at < datetime('now', '-30 seconds'))`
      ).run(participantId, sessionId);
    }
  }

  const participants = db.prepare(
    'SELECT id, display_name, is_creator, is_active, vetos_used FROM participants WHERE session_id = ?'
  ).all(sessionId);

  // BUGFIX: sp.image_url als restaurant_sponsor_image_url ergaenzt. Vorher
  // fehlte das Sponsor-Bild in der Poll-Antwort komplett, wodurch ein
  // gematchtes Sponsor-Restaurant beim naechsten 2-Sekunden-Poll-Tick sein
  // korrektes Bild (das im Swipe-Stack kurz sichtbar war) wieder gegen das
  // Symbolbild verlor - der Poll ueberschreibt setActiveMatch() ein zweites
  // Mal, siehe app/session/[code]/page.tsx.
  const matchSelectFields = `
    m.*,
    r.name as restaurant_name,
    r.address as restaurant_address,
    r.postal_code as restaurant_postal_code,
    r.suburb as restaurant_suburb,
    r.phone as restaurant_phone,
    r.website as restaurant_website,
    r.opening_hours_raw as restaurant_opening_hours_raw,
    r.cuisine as restaurant_cuisine,
    r.lat as restaurant_lat,
    r.lon as restaurant_lon,
    r.osm_image_url as restaurant_osm_image_url,
    r.admin_image_url as restaurant_admin_image_url,
    r.fallback_image_url as restaurant_fallback_image_url,
    sp.image_url as restaurant_sponsor_image_url,
    sp.reservation_url as restaurant_reservation_url
  `;

  const since = req.nextUrl.searchParams.get('since');
  const matches = since
    ? db.prepare(
        `SELECT ${matchSelectFields} FROM matches m
         JOIN restaurants r ON r.id = m.restaurant_id
         LEFT JOIN sponsored_restaurants sp ON sp.restaurant_id = r.id
         WHERE m.session_id = ? AND m.created_at > ?`
      ).all(sessionId, since)
    : db.prepare(
        `SELECT ${matchSelectFields} FROM matches m
         JOIN restaurants r ON r.id = m.restaurant_id
         LEFT JOIN sponsored_restaurants sp ON sp.restaurant_id = r.id
         WHERE m.session_id = ?`
      ).all(sessionId);

  return NextResponse.json({
    session,
    participants,
    matches,
    serverTime: new Date().toISOString(),
  });
}
