import { NextRequest, NextResponse } from 'next/server';
import { getDb } from '@/lib/db';
import { resolveSponsorToRestaurantId } from '@/lib/sponsor-resolver';
import { parseBody, swipeSchema } from '@/lib/validation';

/**
 * Nimmt die letzte Swipe-/Veto-Aktion eines Teilnehmers auf einem bestimmten
 * Restaurant zurueck. Wird vom Frontend direkt nach dem "Zurueck"-Klick
 * aufgerufen, BEVOR die Karte visuell wieder eingeblendet wird - das Frontend
 * haelt selbst Buch darueber, welches Restaurant zuletzt geswiped wurde
 * (letzter Eintrag im lokalen Verlauf), da der Server keinen Aktions-Log
 * fuehrt, nur den aktuellen Zustand in swipes/vetos.
 *
 * direction gibt an, WAS zurueckgenommen wird:
 * - 'yes' | 'no' -> Zeile aus swipes loeschen
 * - 'veto'       -> Zeile aus vetos loeschen UND vetos_used beim Teilnehmer
 *                   wieder um 1 verringern (nie unter 0)
 *
 * Matches werden bewusst NICHT rueckgaengig gemacht, falls durch den
 * zurueckgenommenen Swipe zuvor ein Match entstanden war - das Match bleibt
 * bestehen (History), nur die Swipe-Zuordnung selbst wird entfernt.
 */
export async function POST(req: NextRequest, { params }: { params: Promise<{ code: string }> }) {
  const { code } = await params;
  const parsed = await parseBody(req, swipeSchema);
  if (!parsed.success) return parsed.response;

  const { participantId, restaurantId, direction } = parsed.data;
  const db = getDb();

  const session = db.prepare('SELECT * FROM sessions WHERE code = ?').get(code) as any;
  if (!session) {
    return NextResponse.json({ error: 'Session nicht gefunden' }, { status: 404 });
  }

  const resolvedRestaurantId = await resolveSponsorToRestaurantId(restaurantId);
  if (resolvedRestaurantId === null) {
    return NextResponse.json({ error: 'Restaurant nicht gefunden' }, { status: 404 });
  }

  if (direction === 'veto') {
    const existing = db.prepare(
      'SELECT 1 FROM vetos WHERE session_id = ? AND restaurant_id = ? AND participant_id = ?'
    ).get(session.id, resolvedRestaurantId, participantId);

    if (!existing) {
      return NextResponse.json({ error: 'Kein Veto zum Zuruecknehmen gefunden' }, { status: 404 });
    }

    db.prepare(
      'DELETE FROM vetos WHERE session_id = ? AND restaurant_id = ? AND participant_id = ?'
    ).run(session.id, resolvedRestaurantId, participantId);

    db.prepare(
      'UPDATE participants SET vetos_used = MAX(0, vetos_used - 1) WHERE id = ?'
    ).run(participantId);

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

  const result = db.prepare(
    'DELETE FROM swipes WHERE session_id = ? AND participant_id = ? AND restaurant_id = ?'
  ).run(session.id, participantId, resolvedRestaurantId);

  if (result.changes === 0) {
    return NextResponse.json({ error: 'Kein Swipe zum Zuruecknehmen gefunden' }, { status: 404 });
  }

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