<?php
// fetch_poi_by_gid.php - Version mit PDO und POST-Request
/*
* vorteile von PDO (pg-connect und ORM  framework als alternative) 
*
* - Sicherheit: PDO bietet vorbereitete Statements (Prepared Statements), die das Skript wirksam vor SQL-Injections schützen, da die Daten von der SQL-Abfrage getrennt verarbeitet werden.
*
* - Abstraktion: PDO dient als Datenbank-Abstraktionsschicht. Dies ermöglicht einen theoretisch einfachen Wechsel des Datenbanktyps (z. B. von PostgreSQL zu MySQL) durch Anpassen der Verbindungsdaten, ohne die Abfragesyntax wesentlich zu ändern.
*
* - Fehlerbehandlung: Mit PDO::ERRMODE_EXCEPTION kann PHP im Fehlerfall Ausnahmen auslösen. Dies führt zu einer robusteren und saubereren Fehlerbehandlung, anstatt das Skript abrupt abstürzen zu lassen.
*/

// === Konfiguration, Logging und CORS ===
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$debugLogFile = __DIR__ . '/fetch_poi_by_gid_debug.log';
require_once __DIR__ . '/logging_functions.php';
$config = require_once __DIR__ . '/config.php';
require_once __DIR__ . '/fetch_poi_select.php';

internal_debug_log("--- " . basename(__FILE__) . " START ---", $debugLogFile);

// CORS-Header setzen
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');

// Pre-flight OPTIONS-Anfragen behandeln
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    http_response_code(200);
    exit();
}

// === Überprüfen, ob die Methode POST ist ===
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    internal_debug_log("Ungültige Anfragemethode: " . $_SERVER['REQUEST_METHOD'], $debugLogFile);
    http_response_code(405);
    echo json_encode(['success' => false, 'error' => 'Ungültige Anfragemethode.']);
    exit();
}

// === GID aus dem JSON-Body holen ===
$json_data = file_get_contents('php://input');
$data = json_decode($json_data, true);

if (!isset($data['gid'])) {
    internal_debug_log("Erforderliche GID fehlt im Request-Body.", $debugLogFile);
    http_response_code(400);
    echo json_encode(['success' => false, 'error' => 'Erforderliche GID fehlt.']);
    exit();
}
$gid = (int)$data['gid'];
internal_debug_log("Anfrage validiert. GID: " . $gid . " aus Body gelesen.", $debugLogFile);

// === Verbindungseinstellungen laden ===
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.");
    }
    internal_debug_log("Datenbankverbindung erfolgreich geladen.", $debugLogFile);
} else {
    internal_debug_log("Fehler: Verbindungskonfigurationsdatei 'db-connection.php' fehlt.", $debugLogFile);
    die("Fehler: Verbindungskonfigurationsdatei 'db-connection.php' fehlt.");
}

// === Verbindung zur Datenbank herstellen ===
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);
    die("Verbindung zur Datenbank fehlgeschlagen: " . $e->getMessage());
}

// === SQL-Abfrage vorbereiten und ausführen ===
$tablePrefix = $config['tablePrefix'];
$poiColumns = getPoiSelectFields();
$query = "
    SELECT
        $poiColumns,
        ST_X(ST_Transform(geom, 4326)) as lng,
        ST_Y(ST_Transform(geom, 4326)) as lat
    FROM
        public.{$tablePrefix}
    WHERE gid = :gid
";
internal_debug_log("SQL-Abfrage vorbereitet.", $debugLogFile);

try {
    $stmt = $pdo->prepare($query);
    $stmt->bindParam(':gid', $gid, PDO::PARAM_INT);
    $stmt->execute();
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    internal_debug_log("Abfrage ausgeführt. Ergebnis-Zeilen: " . ($result ? 1 : 0), $debugLogFile);
} catch (PDOException $e) {
    internal_debug_log("Fehler bei der Abfrage: " . $e->getMessage(), $debugLogFile);
    die("Fehler bei der Abfrage: " . $e->getMessage());
}

// JSON-Ergebnis ausgeben
header('Content-Type: application/json');
echo json_encode(['success' => true, 'data' => $result]);

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