<?php
// fetch_pois.php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// === Konfiguration und Validierung importieren ===
$debugLogFile = __DIR__ . '/fetch_pois_debug.log';
require_once __DIR__ . '/logging_functions.php';
require_once __DIR__ . '/validation_functions.php';
$config = require_once __DIR__ . '/config.php';
require_once __DIR__ . '/fetch_poi_select.php';

// 🔥 KRITISCHER FIX: Variablen initialisieren, um die PHP Warning zu vermeiden
$targetTable = ''; 
$tableSuffix = '';

// === Aufruf der Validierungsfunktion ===
if (!isValidDatabaseRequest($debugLogFile)) {
    http_response_code(400);
    echo json_encode(["error" => "Ungültige Parameter in der URL. Erlaubt sind nur start_id, end_id und p."]);
    exit;
}

// ------------------------------------------------------------------
// === CHUNK-PARAMETER BERECHNEN ===
// ------------------------------------------------------------------

$startId = $_GET['start_id'] ?? null;
$endId = $_GET['end_id'] ?? null;

if (!is_numeric($startId) || !is_numeric($endId) || $startId < 0) {
    http_response_code(200);
    header('Content-Type: application/json');
    echo json_encode(['type' => 'FeatureCollection', 'features' => []]);
    internal_debug_log("Chunk-Parameter fehlen oder sind ungültig. Abbruch.", $debugLogFile);
    exit;
}

$offset = (int) $startId;
$limit = (int) $endId - (int) $startId;

if ($limit <= 0) {
    http_response_code(200);
    header('Content-Type: application/json');
    echo json_encode(['type' => 'FeatureCollection', 'features' => []]);
    internal_debug_log("Limit ist 0 oder negativ. Abbruch.", $debugLogFile);
    exit;
}

// ------------------------------------------------------------------
// === DATENQUELLEN-AUSWAHL MIT SICHERER WHITELISTING (p-Parameter) ===
// ------------------------------------------------------------------

$pParam = $_GET['p'] ?? 'default';

switch ($pParam) {
    case 'default':
        $tableSuffix = '';
        break;
    case 'test':
        $tableSuffix = '_test';
        break;
    default:
        $tableSuffix = '';
        $pParam = 'default';
        break;
}

// Berechnet den finalen Tabellennamen
$targetTable = $config['tablePrefix'] . $tableSuffix;

internal_debug_log("Datenquelle: p=$pParam. Wird Tabelle '$targetTable' verwenden.", $debugLogFile);

// ------------------------------------------------------------------
// === Datenbankverbindung herstellen ===
// ------------------------------------------------------------------

if (file_exists(__DIR__ . '/db-connection.php')) {
    $db = require_once __DIR__ . '/db-connection.php';
    if (!is_array($db)) {
        internal_debug_log("Fehler: 'db-connection.php' gibt keine gültige Konfiguration zurück.", $debugLogFile);
        die("Fehler: 'db-connection.php' gibt keine gültige Konfiguration zurück.");
    }
} else {
    internal_debug_log("Fehler: Verbindungskonfigurationsdatei 'db-connection.php' fehlt.", $debugLogFile);
    die("Fehler: Verbindungskonfigurationsdatei 'db-connection.php' fehlt.");
}

try {
    $pdo = new PDO(
        "pgsql:host={$db['host']};port={$db['port']};dbname={$db['dbname']}",
        $db['user'],
        $db['password']
    );
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    internal_debug_log("Verbindung zur Datenbank erfolgreich hergestellt.", $debugLogFile);
} catch (PDOException $e) {
    internal_debug_log("Verbindung zur Datenbank fehlgeschlagen: " . $e->getMessage(), $debugLogFile);
    http_response_code(500);
    echo json_encode(["error" => "Datenbankverbindung fehlgeschlagen."]);
    exit;
}


// ------------------------------------------------------------------
// === SQL-LIMITIERUNG UND SORTIERUNG FÜR CHUNKS (Debugging-Modus entfernt!) ===
// ------------------------------------------------------------------

$limitOffsetClause = "ORDER BY gid ASC LIMIT :limit OFFSET :offset";
$whereClause = ''; 
// $whereClause = "WHERE status = 'x'"; 
// "WHERE status  = 'x' "; // Wichtig: Kei  ne WHERE-Klausel, um alle Daten abzurufen
$bindLimitOffset = true;

internal_debug_log("Normaler Chunk-Abruf. Offset: $offset, Limit: $limit.", $debugLogFile);


// ------------------------------------------------------------------
// === PERFORMANTE SQL-GeoJSON-Abfrage ===
// ------------------------------------------------------------------
// alternativ die Originalwerte der Koordinations-DB            ST_Transform(geom, 4326) as geom
$poiColumns = getPoiSelectFields();
$geoJsonQuery = "
    SELECT json_build_object(
        'type', 'FeatureCollection',
        'features', COALESCE(json_agg(ST_AsGeoJSON(t.*)::json), '[]'::json)
    )
    FROM (
        SELECT
            $poiColumns,
            ST_Transform(geom_geolocation, 4326) AS geom
        FROM
            public.{$targetTable}
        {$whereClause}
        {$limitOffsetClause}
    ) AS t
";

// Abfrage ausführen
try {
    $stmt = $pdo->prepare($geoJsonQuery);
    
    // Bindet LIMIT/OFFSET nur, wenn der Debug-Modus NICHT aktiv ist (was er jetzt nicht mehr ist)
    if ($bindLimitOffset) {
        $stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
        $stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
    }
    
    $stmt->execute();
    
    $result = $stmt->fetch(PDO::FETCH_ASSOC);

    // DEBUG: JSON Snippet und GID 11333 Check (Beibehalten für eventuelle spätere Checks)
    $jsonResultString = null;
    if (isset($result['json_build_object'])) {
        $jsonResultString = $result['json_build_object'];
        $snippet = substr($jsonResultString, 0, 500) . (strlen($jsonResultString) > 500 ? '...' : '');
        internal_debug_log("GeoJSON-Snippet (Start) für Chunk $offset: " . $snippet, $debugLogFile);
    }
    
    if ($jsonResultString) {
        $data = json_decode($jsonResultString, true);
        $targetGid = 11333;
        
        if (isset($data['features']) && is_array($data['features'])) {
            foreach ($data['features'] as $feature) {
                if (isset($feature['properties']['gid']) && $feature['properties']['gid'] == $targetGid) {
                    $coords = isset($feature['geometry']['coordinates']) ? json_encode($feature['geometry']['coordinates']) : 'NULL';
                    
                    internal_debug_log("✅ GID $targetGid (BLANKENBERGSTRASSE) im Chunk $offset GEFUNDEN. Tabelle: $targetTable", $debugLogFile);
                    internal_debug_log("   Koordinaten: $coords", $debugLogFile);
                    break;
                }
            }
        }
    }
    // ENDE DEBUG-CHECK

    if (!$result || !isset($result['json_build_object'])) {
        internal_debug_log("Datenbank gab kein GeoJSON-Objekt zurück. Sende leere FeatureCollection.", $debugLogFile);
        header('Content-Type: application/json');
        echo json_encode(['type' => 'FeatureCollection', 'features' => []]);
        exit;
    }
    
    header('Content-Type: application/json');
    echo $result['json_build_object'];
    
    internal_debug_log("Daten erfolgreich abgerufen und JSON gesendet. Chunk $offset bis " . ($offset + $limit) . " von Tabelle '$targetTable'.", $debugLogFile);

} catch (PDOException $e) {
    internal_debug_log("Datenbankfehler bei der Abfrage: " . $e->getMessage(), $debugLogFile);
    http_response_code(500);
    echo json_encode(["error" => "Datenbankfehler."]);
    exit;
} catch (Exception $e) {
    internal_debug_log("Allgemeiner Fehler: " . $e->getMessage(), $debugLogFile);
    http_response_code(500);
    echo json_encode(["error" => "Interner Fehler beim Erstellen der Antwort."]);
    exit;
}

internal_debug_log("--- " . basename(__FILE__) . " END ---", $debugLogFile);
?>