<?php
// update_poi.php

// --- Fehlerberichterstattung (nur für Debugging im lokalen/Test-Umfeld!) ---
// Schaltet die Anzeige von Fehlern direkt im Browser ein.
// Auf einem Produktivsystem sollte 'display_errors' auf 'Off' stehen!
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// --- Interne Debugging-Log-Funktion ---
// Definiert den Pfad zur Log-Datei. Diese Datei muss vom Webserver beschreibbar sein!
// Idealerweise liegt sie NICHT öffentlich zugänglich im Web-Root auf einem Produktivsystem.
$debugLogFile = __DIR__ . '/update_poi_debug.log';

function internal_debug_log($message, $logFile) {
    // Fügt den Zeitstempel und die Nachricht zur Log-Datei hinzu
    file_put_contents($logFile, date('[Y-m-d H:i:s]') . ' ' . $message . PHP_EOL, FILE_APPEND);
}

// Loggt den Start des Skripts
internal_debug_log("--- " . basename(__FILE__) . " START ---", $debugLogFile);

// Sicherstellen, dass die Response immer JSON ist
header('Content-Type: application/json');

// --- Konfiguration und Datenbankverbindung ---
try {
    // Config laden
    // `require_once` gibt den Wert zurück, den die Datei `return`t (z.B. ein Array)
    $configData = require_once 'config.php';
    $scPoiTable = $configData['scPoiTable'] ?? ''; // Standardwert, falls nicht gesetzt

    // Datenbankverbindungskonfiguration laden
    $dbConfig = require_once 'db-connection.php';
    $host = $dbConfig['host'] ?? 'localhost';
    $port = $dbConfig['port'] ?? 5432;
    $dbname = $dbConfig['dbname'] ?? '';
    $user = $dbConfig['user'] ?? '';
    $password = $dbConfig['password'] ?? '';

    // Verbindungsaufbau zur Datenbank
    $connString = "host=$host port=$port dbname=$dbname user=$user password=$password";
    internal_debug_log("Attempting DB connection: " . $connString, $debugLogFile); // Loggt den Verbindungsstring
    $dbconn = pg_connect($connString);

    if (!$dbconn) {
        $dbError = pg_last_error();
        internal_debug_log("Database connection failed: " . $dbError, $debugLogFile);
        echo json_encode(['success' => false, 'error' => 'Datenbankverbindung fehlgeschlagen', 'details' => $dbError]);
        exit; // Skript beenden, wenn keine DB-Verbindung
    }
    internal_debug_log("Database connection successful.", $debugLogFile);

    // --- Eingabedaten verarbeiten ---
    $input = file_get_contents('php://input');
    internal_debug_log("Received raw input: " . $input, $debugLogFile);

    $data = json_decode($input, true);

    if (json_last_error() !== JSON_ERROR_NONE) {
        $jsonError = json_last_error_msg();
        internal_debug_log("JSON Decode Error: " . $jsonError, $debugLogFile);
        echo json_encode(['success' => false, 'error' => 'Ungültige JSON-Eingabe.', 'details' => $jsonError]);
        exit;
    }

    // Debugging-Ausgabe bei Eingangsdaten
    internal_debug_log("Decoded input data: " . print_r($data, true), $debugLogFile);

    // Überprüfen, ob die erforderlichen Daten vorhanden sind
    if (!isset($data['gid'], $data['username'], $data['deviceInfo'])) {
        internal_debug_log("Missing required data: GID, username, or deviceInfo.", $debugLogFile);
        echo json_encode(['success' => false, 'error' => 'Fehlende Daten', 'details' => 'GID, Benutzername oder Geräteinformationen fehlen.']);
        exit;
    }

    // Daten validieren und zuweisen
    $gid = filter_var($data['gid'], FILTER_VALIDATE_INT);
    // FILTER_SANITIZE_STRING ist in PHP 8.x deprecated, sollte str_replace oder htmlspecialchars sein,
    // aber für Debugging ok, da es nur um die Konsistenz des inputs geht.
    $username = filter_var($data['username'], FILTER_SANITIZE_STRING);
    $device_info = json_encode($data['deviceInfo']); // Device-Info als JSON speichern

    // Weitere Debugging-Ausgaben
    internal_debug_log("Validated GID: " . ($gid === false ? 'Validation failed' : $gid), $debugLogFile);
    internal_debug_log("Sanitized Username: " . ($username === false ? 'Sanitization failed' : $username), $debugLogFile);
    internal_debug_log("Device Info (JSON): " . $device_info, $debugLogFile);

    // Überprüfung auf fehlgeschlagene Validierung
    if ($gid === false) {
        internal_debug_log("GID validation failed.", $debugLogFile);
        echo json_encode(['success' => false, 'error' => 'Ungültige GID', 'details' => 'Die GID ist keine gültige Ganzzahl.']);
        exit;
    }


    // --- SQL-Update-Query vorbereiten und ausführen ---
    $query = "
        UPDATE public.{$scPoiTable}
        SET
            last_cleaned = CURRENT_TIMESTAMP,
            cleaned_by = $2
        WHERE gid = $1
        RETURNING last_cleaned;
    ";
    internal_debug_log("SQL Query to execute: " . $query, $debugLogFile);

    // SQL-Parameter
    $params = array($gid, $username);
    internal_debug_log("SQL Params: " . implode(', ', $params), $debugLogFile);

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

    if (!$result) {
        $dbQueryError = pg_last_error($dbconn);
        internal_debug_log("Database query failed: " . $dbQueryError, $debugLogFile);
        echo json_encode(['success' => false, 'error' => 'Datenbankabfrage fehlgeschlagen', 'details' => $dbQueryError]);
        exit;
    }
    internal_debug_log("SQL Query executed successfully.", $debugLogFile);

    // --- Ergebnis verarbeiten ---
    $row = pg_fetch_assoc($result);
    if ($row) {
        $response = [
            'success' => true,
            'last_cleaned' => $row['last_cleaned']
        ];
        internal_debug_log("Update successful. New last_cleaned: " . $row['last_cleaned'], $debugLogFile);
    } else {
        // Dies könnte passieren, wenn keine Zeile mit der GID gefunden wurde
        $response = [
            'success' => false,
            'error' => 'Kein Datensatz gefunden oder aktualisiert für GID: ' . $gid
        ];
        internal_debug_log("No row found or updated for GID: " . $gid, $debugLogFile);
    }

    // Verbindung schließen
    pg_free_result($result);
    pg_close($dbconn);
    internal_debug_log("Database connection closed.", $debugLogFile);

    // Debugging-Ausgabe der finalen Antwort
    internal_debug_log("Final response: " . json_encode($response), $debugLogFile);
    echo json_encode($response);

} catch (Throwable $e) {
    // Fängt alle Arten von Fehlern (Exceptions und Error) ab PHP 7
    $errorMessage = "Unhandled exception/error: " . $e->getMessage() . " in " . $e->getFile() . " on line " . $e->getLine();
    internal_debug_log($errorMessage, $debugLogFile);
    echo json_encode(['success' => false, 'error' => 'Ein unerwarteter Fehler ist aufgetreten.', 'details' => $errorMessage]);
    // Stellen Sie sicher, dass die Datenbankverbindung geschlossen wird, falls sie geöffnet wurde
    if (isset($dbconn) && is_resource($dbconn)) {
        pg_close($dbconn);
    }
}

internal_debug_log("--- " . basename(__FILE__) . " END ---", $debugLogFile); // Loggt das Ende des Skripts
?>