<?php
// get_addresses_here.php
// Holt Adressvorschläge von der HERE GEOCODING API, gefiltert auf Stadt "Berlin", Hausnummer vorhanden UND exakt gleiche Hausnummer.
// Liefert Ergebnisse in der vereinfachten, kombinierten Frontend-Struktur, PLUS dem originalen HERE-Ergebnis.

// ====================================================================
// KONFIGURATION
// ====================================================================

// HIER MUSS IHR TATSÄCHLICHER HERE API SCHLÜSSEL EINGEFÜGT WERDEN!
define('HERE_API_KEY', 'okEOI_7ww-l-Eop_6L8XY8YpWT2G-3bBNcO7ZoVT_P8'); 
define('HERE_API_URL', 'https://geocode.search.hereapi.com/v1/geocode'); 

// ====================================================================

// Fehlerberichterstattung aktivieren (für Entwicklung, in Produktion auf 0 setzen)
ini_set('display_errors', 1);
error_reporting(E_ALL);

// Logging-Funktionen (Stellt sicher, dass internal_debug_log verfügbar ist)
$debugLogFile = __DIR__ . '/get_addresses_here_debug.log';

if (!function_exists('internal_debug_log')) {
    function internal_debug_log($message, $file_path = '') {
        global $debugLogFile;
        $file = $file_path ?: $debugLogFile;
        $logMessage = (is_string($message) && strlen($message) > 500) ? substr($message, 0, 500) . '...' : $message;
        file_put_contents($file, date('[Y-m-d H:i:s]') . ' ' . $logMessage . PHP_EOL, FILE_APPEND);
    }
}


// ====================================================================
// FUNKTION ZUR BESTIMMUNG DER PRÄZISION
// ====================================================================
/**
 * Mappt die HERE-Präzisionstypen auf die Zielwerte 'precise' oder 'interpolated'.
 *
 * Priorisiert die Prüfung von 'houseNumberType' auf 'PA' (Point Address) im address-Objekt.
 *
 * @param array $item Das einzelne Ergebnis-Item von der HERE API.
 * @return string 'precise' oder 'interpolated'.
 */
function determine_precision_here(array $item): string
{
    // KORREKTUR: houseNumberType direkt aus dem Haupt-Item ($item) abrufen.
    // Das Feld liegt nicht unter 'address', sondern auf der Hauptebene des Resultats.
    $house_number_type = strtolower($item['houseNumberType'] ?? ''); 

    // 1. Spezifischste Prüfung: 'PA' (Point Address)
    if ($house_number_type === 'pa') {
        return 'precise';
    }

    // 2. Fallback-Prüfungen auf allgemeinere Präzisionsfelder
    $match_type = strtolower(
        $item['scoring']['matchType'] ?? 
        $item['resultType'] ?? 
        ''
    );

    // Prüfen, ob der MatchType eine hohe Präzision impliziert
    if ($match_type === 'house_number' || $match_type === 'pointaddress') {
        return 'precise';
    }
    
    // 3. Wenn weder 'PA' noch ein präziser MatchType gefunden wurde.
    return 'interpolated';
}

// ====================================================================

header('Content-Type: application/json; charset=utf-8');
internal_debug_log("DEBUG: get_addresses_here.php gestartet (Geocoding mit Hausnummer-Exakt-Filter).", $debugLogFile);

// --- START HAUPTPROGRAMM ---
if (isset($_GET['q']) && !empty($_GET['q'])) {
    $query = $_GET['q'];
    
    // ====================================================================
    // Hausnummer aus dem Query extrahieren
    // ====================================================================
    $query_house_number = '';
    // Regex sucht nach einer Zahl (ggf. mit Buchstaben, z.B. 42a) am Ende des Strings.
    if (preg_match('/(\d+[a-zA-Z]?)$/', trim($query), $matches)) {
        $query_house_number = trim($matches[1]);
        internal_debug_log("DEBUG: Extrahierte Hausnummer aus Query: " . $query_house_number, $debugLogFile);
    }
    // ====================================================================
    
    // 1. URL-Erstellung
    $query_params = [


        'q' => $query, 
        'apiKey' => HERE_API_KEY,
        'limit' => 29,
        'in' => 'countryCode:DEU',
    ];
/*
    // URL-Erstellung in get_addresses_here.php:
$query_params = [
    'q' => $query, 
    'apiKey' => HERE_API_KEY,
    'limit' => 9,
    // Ändern Sie dies, um Berlin direkt zu priorisieren:
    // 'in' => 'countryCode:DEU', 
    // ODER (besser für Berlin)
    'in' => 'bbox:13.0,52.3,13.8,52.6', // Berlin Bounding Box
];*/
    $api_url = HERE_API_URL . '?' . http_build_query($query_params);
    $api_url = str_replace('+', '%20', $api_url); 
    
    internal_debug_log("DEBUG: Final HERE API URL: " . $api_url, $debugLogFile);

    // 2. cURL Aufruf
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $api_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    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/1.0 (Stolperclean@gmail.com)' 
    ));

    $response = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $error_msg = curl_error($ch);
    curl_close($ch);
    
    // 3. Fehlerbehandlung
    if (curl_errno($ch)) {
        internal_debug_log("ERROR: cURL-Fehler beim Abrufen der HERE-Daten: " . $error_msg, $debugLogFile);
        http_response_code(500);
        echo json_encode(['error' => 'Interner Serverfehler beim Abrufen der Adressdaten: ' . $error_msg]);
        exit;
    }

    if ($http_code >= 400) {
        internal_debug_log("ERROR: HERE API HTTP Error {$http_code}: " . $response, $debugLogFile);
        http_response_code(502); 
        $error_detail = "HERE API Fehler: Status {$http_code}.";
        if ($http_code === 401) {
             $error_detail .= " Wahrscheinlich ungültiger API Key.";
        }
        echo json_encode(['error' => $error_detail . " " . substr($response, 0, 200)]);
        exit;
    }

    // 4. Datenverarbeitung und Filterung
    $here_data = json_decode($response, true);
    $standard_results = [];

    if (isset($here_data['items']) && is_array($here_data['items'])) {
        foreach ($here_data['items'] as $item) {
            
            $item_address = $item['address'] ?? [];
            $item_city = $item_address['city'] ?? '';
            $item_house_number = $item_address['houseNumber'] ?? '';
            
            // --- FILTER 1: Muss eine Hausnummer enthalten (Grund-Check) ---
            if (empty(trim($item_house_number))) {
                internal_debug_log("DEBUG: Eintrag gefiltert (Keine Hausnummer gefunden).", $debugLogFile);
                continue; 
            }
            
            // --- FILTER 2: Muss in Berlin sein (Case-Insensitive) ---
            if (strtolower(trim($item_city)) !== 'berlin') { 
                internal_debug_log("DEBUG: Eintrag gefiltert (Stadt ist nicht Berlin: {$item_city}).", $debugLogFile);
                continue; 
            }

            // FILTER 3: Hausnummer muss exakt der im Query entsprechen
            if ($query_house_number !== '') {
                if (strtolower(trim($item_house_number)) !== strtolower($query_house_number)) { 
                    internal_debug_log("DEBUG: Eintrag gefiltert (Hausnummer {$item_house_number} passt nicht exakt zur Query-Nummer {$query_house_number}).", $debugLogFile);
                    continue; 
                }
            }

            // 5. TRANSFORMATION: Mapping der HERE-Felder auf die vereinfachte Struktur
            $standard_results[] = [
                'source'     => 'HERE', 
                'precision'  => determine_precision_here($item), 
                
                // Attribut-Mapping auf die obere Ebene
                'street'     => $item_address['street'] ?? '',
                'houseNr'    => $item_address['houseNumber'] ?? '', 
                'district'   => $item_address['district'] ?? '', 
                
                // City und Postcode
                'city'       => $item_address['city'] ?? '',
                'postcode'   => $item_address['postalCode'] ?? '',
                
                // Koordinaten
                'lat'        => $item['position']['lat'] ?? null,
                'lon'        => $item['position']['lng'] ?? null,

                // NEU: Hinzufügen des vollständigen Original-Ergebnisses
                'original_result' => $item, 
            ];
        }
    }
    
    // 6. Ausgabe
    if (count($standard_results) === 0) {
        internal_debug_log("DEBUG: Keine Adress-Treffer gefunden. Sende leeres Array [].", $debugLogFile);
        $standard_results = [];
    }
    
    internal_debug_log("DEBUG: Antwort von HERE API transformiert und an Client gesendet. Gefilterte Ergebnisse: " . count($standard_results), $debugLogFile);

        echo json_encode($standard_results, JSON_PRETTY_PRINT);

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

internal_debug_log("DEBUG: get_addresses_here.php beendet.", $debugLogFile);
?>