<?php
// fetch_poi_by_address.php
// Dieses Skript fragt Points of Interest (POI) basierend auf Straße und Hausnummer ab und transformiert die Daten.

// --- Fehlerberichterstattung (NUR FÜR DEBUGGING IM ENTWICKLUNGS-/TEST-UMFELD!) ---
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// --- Pfade und Debug-Log-Setup ---
$debugLogFile = __DIR__ . '/fetch_poi_by_address_debug.log';
$configFile = __DIR__ . '/config.php';
$dbConfigFile = __DIR__ . '/db-connection.php';

// --- Essentielle Abhängigkeiten laden (Prüfen auf Existenz) ---
if (!file_exists(__DIR__ . '/logging_functions.php') || !file_exists(__DIR__ . '/fetch_poi_select.php')) {
    // Wenn logging_functions fehlt, können wir nicht loggen. Nur rohe Fehlerausgabe.
    header('Content-Type: application/json', true, 500);
    exit(json_encode(['success' => false, 'error' => 'Kritische PHP-Dateien (logging_functions.php oder fetch_poi_select.php) fehlen.']));
}

require_once __DIR__ . '/logging_functions.php';
require_once __DIR__ . '/fetch_poi_select.php';

// Loggt den Start des Skripts (Wenn dies nicht geloggt wird, liegt der Fehler davor!)
internal_debug_log("--- " . basename(__FILE__) . " START (RAW QUERY_STRING logging) ---", $debugLogFile);

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

// --- Gesamten Skriptinhalt in einen Try-Catch-Block einschließen ---
try {
    // =================================================================
    // === 1. Konfiguration laden ===
    // =================================================================

    // --- config.php laden ---
    if (file_exists($configFile)) {
        $configData = require_once $configFile;
        if (!is_array($configData)) {
            internal_debug_log("Fehler: 'config.php' gibt kein gültiges Array zurück.", $debugLogFile);
            throw new Exception("Konfigurationsdatei (config.php) fehlerhaft. (Erwarte 'return [...]')");
        }
    } else {
        internal_debug_log("Fehler: Konfigurationsdatei '$configFile' fehlt.", $debugLogFile);
        throw new Exception("Konfigurationsdatei (config.php) fehlt.");
    }
    
    // Logik zur dynamischen Tabellenauswahl (pParam wird geprüft)
    $pParam = $_GET['p'] ?? 'default';
    
    // Wenn 'p' leer ist (was bei '&p' am Ende passiert), soll es als 'default' behandelt werden,
    // um die Produktionslogik zu triggern, wie vom Benutzer gewünscht.
    if ($pParam === '') {
        $pParam = 'default';
    }

    $baseTablePrefix = $configData['tablePrefix'] ?? '';
    $tableSuffix = '';
    
    switch ($pParam) {
        case 'default':
            $tableSuffix = ''; // Production table
            break;
        case 'test':
            $tableSuffix = '_test';
            break;
        default:
            $tableSuffix = ''; // Fallback auf Production table
            $pParam = 'default';
            break;
    }
    
    $targetTable = $baseTablePrefix . $tableSuffix;
    internal_debug_log("Datenquelle: p=$pParam. Wird Tabelle '$targetTable' verwenden.", $debugLogFile);

    // --- db-connection.php laden ---
    if (file_exists($dbConfigFile)) {
        $dbConfig = require_once $dbConfigFile;
        if (!is_array($dbConfig)) {
            internal_debug_log("Fehler: 'db-connection.php' gibt kein gültiges Array zurück.", $debugLogFile);
            throw new Exception("Datenbank-Konfigurationsdatei (db-connection.php) fehlerhaft. (Erwarte 'return [...]')");
        }
    } else {
        internal_debug_log("Fehler: Verbindungskonfigurationsdatei '$dbConfigFile' fehlt.", $debugLogFile);
        throw new Exception("Datenbank-Konfigurationsdatei (db-connection.php) fehlt.");
    }
    
    internal_debug_log("DB config loaded.", $debugLogFile);

    $host = $dbConfig['host'] ?? 'localhost';
    $port = $dbConfig['port'] ?? 5432;
    $dbname = $dbConfig['dbname'] ?? '';
    $user = $dbConfig['user'] ?? '';
    $password = $dbConfig['password'] ?? '';

    // =================================================================
    // === 2. Datenbankverbindung herstellen (pg_connect) ===
    // =================================================================
    $connString = "host=$host port=$port dbname=$dbname user=$user password=$password";
    internal_debug_log("Attempting DB connection.", $debugLogFile);
    
    // Verwenden des @-Operators, um Warnungen zu unterdrücken und Fehler selbst zu behandeln
    $dbconn = @pg_connect($connString); 

    if (!$dbconn) {
        $dbError = pg_last_error();
        internal_debug_log("Database connection failed: " . $dbError, $debugLogFile);
        throw new Exception("Datenbankverbindung fehlgeschlagen: " . ($dbError ?: "Unbekannter Fehler"));
    }
    internal_debug_log("Database connection successful. Client encoding: UTF8", $debugLogFile);

    // Encoding des Clients auf UTF8 setzen
    pg_set_client_encoding($dbconn, "UTF8");

    // =================================================================
    // === 3. Datenverarbeitung ===
    // =================================================================
    
    // NEU: Protokolliert den rohen, unverarbeiteten Query-String, wie ihn der Server an PHP übergeben hat.
    internal_debug_log("RAW QUERY_STRING: " . ($_SERVER['QUERY_STRING'] ?? 'N/A'), $debugLogFile);
    internal_debug_log("RAW \$_GET: " . print_r($_GET, true), $debugLogFile);

    // --- Eingabedaten aus URL-Parametern (GET-Request) ---
    $data = [
        'street' => $_GET['street'] ?? null,
        'houseNr' => $_GET['houseNr'] ?? null // Erwartet houseNr vom Frontend
    ];
    internal_debug_log("Received Mapped data: " . print_r($data, true), $debugLogFile);

    // Überprüfen, ob die erforderlichen Daten vorhanden sind
    if (!isset($data['street'], $data['houseNr']) || empty($data['street']) || empty($data['houseNr'])) {
        internal_debug_log("Missing required GET data: street or houseNr. Check RAW QUERY_STRING above.", $debugLogFile);
        http_response_code(400);
        echo json_encode(['success' => false, 'error' => 'Fehlende Daten (Straße oder Hausnummer).']);
        exit;
    }

    // --- SQL-Abfrage vorbereiten ---
    $poiColumns = getPoiSelectFields();
    
    $sql = "
        SELECT 
            $poiColumns,
            ST_Y(geom_geolocation) AS lat, 
            ST_X(geom_geolocation) AS lon,
            '' AS postcode 
        
        FROM \"$targetTable\" 
        WHERE 
            street ILIKE $1 AND 
            house_no = $2 -- Die DB-Spalte heißt weiterhin house_no
        LIMIT 10
    ";
    
    // Parameter für die Abfrage
    $streetParam = "%" . trim($data['street']) . "%"; 
    $house_noParam = trim($data['houseNr']); 
    
    $queryParams = [
        $streetParam,
        $house_noParam // Gebunden an $2 (DB-Feld house_no)
    ];

    internal_debug_log("Executing SQL: " . $sql . " with params: " . print_r($queryParams, true), $debugLogFile);

    // --- Abfrage ausführen ---
    $result = pg_query_params($dbconn, $sql, $queryParams);

    if (!$result) {
        $dbError = pg_last_error($dbconn);
        internal_debug_log("SQL query failed: " . $dbError, $debugLogFile);
        throw new Exception('Datenbankabfrage fehlgeschlagen: ' . $dbError);
    }

    // --- Ergebnisse verarbeiten ---
    $rows = pg_fetch_all($result);
    pg_free_result($result);

    internal_debug_log("Abfrage ausgeführt. Gefundene Datensätze: " . (count($rows) ?: 0), $debugLogFile);

    // === Ergebnis transformieren und zurückgeben ===
    $transformed_data = array_map(function($row) use ($data) {
        
        // Die display_name-Logik findet nun ausschließlich in PHP statt
        $displayName = "Stolperstein: " . 
                       ($row['first_name'] ?? 'N/A') . " " . 
                       ($row['last_name'] ?? 'N/A') . 
                       (isset($row['year_of_birth']) && $row['year_of_birth'] > 0 ? " (geb. {$row['year_of_birth']})" : "");

        return [
            'source'     => 'POI',
            'precision'  => 'precise',
            'street'     => $row['street'] ?? $data['street'],
            'houseNr'    => $row['house_no'] ?? $data['houseNr'], // DB-Spalte house_no wird zu Output-Feld houseNr
            'district'   => $row['localdistrict'] ?? '',
            'city'       => 'Berlin', 
            'postcode'   => $row['postcode'] ?? '', 
            'lat'        => (float)($row['lat'] ?? 0),
            'lon'        => (float)($row['lon'] ?? 0),
            
            'first_name'   => $row['first_name'] ?? '',
            'last_name'    => $row['last_name'] ?? '',
            'year_of_birth' => (int)($row['year_of_birth'] ?? 0),
            
            'display_name' => $displayName,
        ];
    }, $rows ?: []); 

    // Verbindung schließen, wenn erfolgreich
    if (isset($dbconn) && $dbconn) {
        pg_close($dbconn);
    }

    $response = [
        'success' => true,
        'data' => $transformed_data
    ];

    internal_debug_log("Successfully processed " . count($transformed_data) . " POI(s). Sending response.", $debugLogFile);
    echo json_encode($response, JSON_PRETTY_PRINT);


} catch (Exception $e) {
    // Behandelt alle Konfigurations-, Datei- und Datenbank-Fehler
    internal_debug_log("Caught global Exception: " . $e->getMessage(), $debugLogFile);
    
    // Verbindung schließen, falls sie geöffnet war
    if (isset($dbconn) && $dbconn) {
        pg_close($dbconn);
    }

    // Setzt HTTP-Antwortcode für Serverfehler und gibt JSON aus
    http_response_code(500);
    echo json_encode(['success' => false, 'error' => 'Ein unerwarteter Serverfehler ist aufgetreten.', 'details' => $e->getMessage()]);
}

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

?>