<?php
// update_poi_general.php - Zentrale Funktion für POI-Updates (inkl. Geometrie)

function update_poi_general($dataToUpdate, $debugLogFile) {
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
    }
    $sessionUid = isset($_SESSION['uid']) ? (int)$_SESSION['uid'] : 1;

    internal_debug_log("Starting general update function. UID: $sessionUid", $debugLogFile);

    $tableName = $dataToUpdate['poiTable'];
    $dbConfig = require __DIR__ . '/db-connection.php';
    $connString = "host={$dbConfig['host']} port={$dbConfig['port']} dbname={$dbConfig['dbname']} user={$dbConfig['user']} password={$dbConfig['password']}";
    $dbconn = pg_connect($connString);

    if (!$dbconn) {
        $dbError = pg_last_error();
        internal_debug_log("Database connection failed: " . $dbError, $debugLogFile);
        return ['success' => false, 'message' => 'Datenbankverbindung fehlgeschlagen'];
    }
    pg_set_client_encoding($dbconn, "UTF8");

    // Trigger-Variablen für das DB-Logging setzen
    if (isset($dataToUpdate['action_text'])) {
        $actionLabel = pg_escape_string($dbconn, $dataToUpdate['action_text']);
        pg_query($dbconn, "SET myapp.action = '$actionLabel'");
        pg_query($dbconn, "SET myapp.user_id = $sessionUid");
    }

    // 1. White-List für normale Text/Zahlen-Felder
    $allowedFields = [
        'last_cleaned', 'updated_at', 'first_name', 'last_name', 
        'year_of_birth', 'stone_position', 'caretaker',
        'street', 'house_no', 'localdistrict' // Die neuen Adressfelder
    ];
    
    $updateFields = [];
    $queryParams = [];
    $paramIndex = 1;

    // Normale Felder verarbeiten
    foreach ($allowedFields as $field) {
        if (array_key_exists($field, $dataToUpdate)) {
            $updateFields[] = pg_escape_identifier($dbconn, $field) . ' = $' . $paramIndex;
            $queryParams[] = $dataToUpdate[$field];
            $paramIndex++;
        }
    }

    // 2. Spezial-Logik für GEOMETRIE (geom_geolocation)
    // Wir prüfen auf lat/lng im Input und bauen das PostGIS-Fragment
    if (isset($dataToUpdate['lat']) && isset($dataToUpdate['lng'])) {
        $lng = (float)$dataToUpdate['lng'];
        $lat = (float)$dataToUpdate['lat'];

        // ST_SetSRID kann nicht via Standard-Platzhalter für den Spaltennamen gesetzt werden,
        // daher fügen wir das Funktions-Fragment direkt in das SET-Array ein.
        $updateFields[] = "geom_geolocation = ST_SetSRID(ST_MakePoint($" . $paramIndex . ", $" . ($paramIndex + 1) . "), 4326)";
        
        $queryParams[] = $lng; // $paramIndex
        $queryParams[] = $lat; // $paramIndex + 1
        $paramIndex += 2;
        
        internal_debug_log("Geometrie-Update erkannt: Lng $lng, Lat $lat", $debugLogFile);
    }

    // GID Validierung
    $gid = filter_var($dataToUpdate['gid'], FILTER_VALIDATE_INT);
    if ($gid === false) {
        pg_close($dbconn);
        return ['success' => false, 'message' => 'Ungültige GID'];
    }

    if (empty($updateFields)) {
        pg_close($dbconn);
        return ['success' => false, 'message' => 'Keine Daten zum Ändern übergeben.'];
    }

    // Finalen Query-String zusammenbauen
    $queryParams[] = $gid; // Die GID ist immer der letzte Parameter
    $setClause = implode(', ', $updateFields);
    $query = "UPDATE public." . pg_escape_identifier($dbconn, $tableName) . " SET {$setClause} WHERE gid = $" . $paramIndex . " RETURNING *;";
    
    internal_debug_log("Generated SQL: " . $query, $debugLogFile);

    $result = pg_query_params($dbconn, $query, $queryParams);

    if (!$result) {
        $dbQueryError = pg_last_error($dbconn);
        internal_debug_log("Query failed: " . $dbQueryError, $debugLogFile);
        pg_close($dbconn);
        return ['success' => false, 'message' => 'Datenbankfehler beim Update', 'details' => $dbQueryError];
    }

    $updatedRow = pg_fetch_assoc($result);
    pg_free_result($result);
    pg_close($dbconn);

    if ($updatedRow) {
        internal_debug_log("Update successful. GID: " . $updatedRow['gid'], $debugLogFile);
        return [
            'success' => true,
            'message' => 'Update erfolgreich',
            'last_cleaned' => $updatedRow['last_cleaned'] ?? null
        ];
    } else {
        return ['success' => false, 'message' => 'Datensatz nicht gefunden.'];
    }
}
?>