<?php
// get_addresses_ajax.php
// Sucht Adressen in der Nominatim API (OpenStreetMap) und transformiert den Output.


// === HILFSFUNKTIONEN ===

/**
 * Bestimmt die Präzision ('precision') basierend auf den Nominatim-Klassifizierungen.
 * * @param array $result Ein einzelnes Nominatim-Suchergebnis-Objekt.
 * @return string Der abgeleitete Präzisions-String ('precise' oder 'interpolated').
 */
function determine_precision(array $result): string {
    $class = $result['class'] ?? '';
    $type = $result['type'] ?? '';

    // 'precise' für Hausnummern, Gebäude und wichtige Punkte
    if ($class === 'building' || ($class === 'place' && $type === 'house_number') || !empty($result['address']['house_number'])) {
        return 'precise';
    }
    
    // Alle anderen Treffer (Straßen, Städte, ungenaue Treffer) werden als 'interpolated' betrachtet.
    return 'interpolated';
}


/**
 * Transformiert das Nominatim-Ergebnis in das gewünschte Zielformat.
 * * @param array $nominatim_results Die rohe Array-Antwort von Nominatim.
 * @return array Das Array von transformierten Adressobjekten.
 */
function transform_nominatim_results(array $nominatim_results): array {
    $transformed_results = [];

    foreach ($nominatim_results as $result) {
        $address = $result['address'] ?? [];

        $transformed_results[] = [
            'source'     => 'OSM', // Statisch festgelegt
            'precision'  => determine_precision($result),
            
            // Attribut-Mapping
            'street'     => $address['road'] ?? '',
            'houseNr'    => $address['house_number'] ?? '',
            'district'   => $address['suburb'] ?? '',
            'city'       => $address['city'] ?? $address['town'] ?? $address['village'] ?? '',
            'postcode'   => $address['postcode'] ?? '',
            
            // Koordinaten
            'lat'        => $result['lat'] ?? '',
            'lon'        => $result['lon'] ?? '',
        ];
    }

    return $transformed_results;
}

// === START DES HAUPTSKRIPTS ===

// Fehlerberichterstattung für die Entwicklung aktivieren
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// Pfad zur Log-Datei definieren
$debugLogFile = __DIR__ . '/get_addresses_nominatim_debug.log';

// Voraussetzung: Die Datei logging_functions.php muss existieren
if (file_exists(__DIR__ . '/logging_functions.php')) {
    require_once __DIR__ . '/logging_functions.php';
} else {
    function internal_debug_log(string $message, string $logFile = '') {
        error_log($message);
    }
}

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: GET, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    http_response_code(200);
    exit();
}

if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
    internal_debug_log("Ungültige Anfragemethode: " . $_SERVER['REQUEST_METHOD'], $debugLogFile);
    http_response_code(405);
    echo json_encode(['error' => 'Ungültige Anfragemethode. Erwarte GET.']);
    exit();
}

// Überprüfen, ob der Parameter 'q' übergeben wurde
if (isset($_GET['q']) && !empty($_GET['q'])) {
    $query = $_GET['q'];
    internal_debug_log("Abfrageparameter 'q' erhalten: " . $query, $debugLogFile);

    // ANPASSUNG: 'Berlin' an die Abfrage anhängen (wie zuvor gewünscht)
    if (stripos($query, 'berlin') === false) {
        $query .= ', Berlin';
    }

    $search_query_encoded_for_api = urlencode($query);
    $berlin_bbox = "13.0883,52.3382,13.7611,52.6755";

    $api_url = "https://nominatim.openstreetmap.org/search?q=" . $search_query_encoded_for_api .
               "&format=json&addressdetails=1&limit=9" .
               "&viewbox=" . $berlin_bbox . "&bounded=1";

    internal_debug_log("Nominatim API URL: " . $api_url, $debugLogFile);

    // cURL-Block
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $api_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'User-Agent: Stolperclean (deine@email.com)' // *** BITTE HIER ANPASSEN ***
    ));

    internal_debug_log("Vor curl_exec().", $debugLogFile);

    $response = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    internal_debug_log("Nach curl_exec(). HTTP Status Code: " . $http_code, $debugLogFile);

    if (curl_errno($ch)) {
        $error_msg = curl_error($ch);
        curl_close($ch);
        internal_debug_log("cURL-Fehler: " . $error_msg, $debugLogFile);
        http_response_code(500);
        echo json_encode(['error' => 'Interner Serverfehler beim Abrufen der Adressdaten: ' . $error_msg]);
        internal_debug_log("--- " . basename(__FILE__) . " END (cURL-Fehler) ---", $debugLogFile);
        exit;
    }

    curl_close($ch);

    if ($http_code !== 200) {
        http_response_code(502); 
        echo json_encode(['error' => "Nominatim-API-Fehler. HTTP Status Code: $http_code"]);
        internal_debug_log("--- " . basename(__FILE__) . " END (HTTP-Fehler) ---", $debugLogFile);
        exit;
    }
    
    // ** TRANSFORMATION DER DATEN **
    $nominatim_results = json_decode($response, true);

    if ($nominatim_results === null && $response !== '[]') {
        internal_debug_log("Fehler beim Dekodieren der JSON-Antwort: " . $response, $debugLogFile);
        http_response_code(500);
        echo json_encode(['error' => 'Interner Serverfehler: Ungültige JSON-Antwort von Nominatim.']);
        exit;
    }
    
    // Hier findet die Transformation statt
    $transformed_data = transform_nominatim_results($nominatim_results);
    
    // Loggen und Senden der transformierten Daten
    $log_response = substr(json_encode($transformed_data), 0, 1000);
    if (strlen(json_encode($transformed_data)) > 1000) {
        $log_response .= '... (Gekürzt)';
    }
    internal_debug_log("Transformierte Antwort (" . count($transformed_data) . " Ergebnisse): " . $log_response, $debugLogFile);
    
    internal_debug_log("Antwort von Nominatim transformiert und an Client gesendet.", $debugLogFile);
    
//    echo json_encode($transformed_data);
    echo json_encode($transformed_data, JSON_PRETTY_PRINT);

} else {
    internal_debug_log("Abfrageparameter 'q' fehlt oder ist leer.", $debugLogFile);
    http_response_code(400);
    echo json_encode(['error' => 'Abfrageparameter "q" fehlt oder ist leer.']);
}

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