<?php

// validate_address.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,
// um die Ausgabe von get_addresses_here.php zu replizieren.

// HINWEIS: Die Query wurde auf die einfache Form (limit=1, KEINE BBOX) reduziert,
// aber die erweiterte Filter- und Transformationslogik (Filter 1, 2, 3) bleibt im Code,
// wird aber nur auf das EINE beste Ergebnis angewendet.

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

// Ihr HERE API Schlüssel
$here_api_key = 'okEOI_7ww-l-Eop_6L8XY8YpWT2G-3bBNcO7ZoVT_P8'; 
define('HERE_API_KEY', $here_api_key); // Für die Verwendung in der Logik
define('HERE_API_URL', 'https://geocode.search.hereapi.com/v1/geocode'); 

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

// Fehlerberichterstattung aktivieren
// ini_set('display_errors', 1); // Kann in Produktionsumgebungen zu Fehlern führen
error_reporting(E_ALL);

// Laden der Logging-Funktionen
$debugLogFile = __DIR__ . '/validate_address_debug.log';
require_once __DIR__ . '/logging_functions.php';

// ====================================================================
// FUNKTION ZUR BESTIMMUNG DER PRÄZISION
// ====================================================================
/**
 * Mappt die HERE-Präzisionstypen auf die Zielwerte 'precise' oder 'interpolated'.
 *
 * @param array $item Das einzelne Ergebnis-Item von der HERE API.
 * @return string 'precise' oder 'interpolated'.
 */
function determine_precision_here(array $item): string
{
    $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';
}
// ====================================================================


// Sicherstellen, dass der Content-Type als JSON mit UTF-8 gesendet wird
header('Content-Type: application/json; charset=utf-8');
internal_debug_log("DEBUG: validate_address.php gestartet (Replikation der get_addresses_here.php Logik, aber mit limit=1).", $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 (ANGEPASST: Jetzt mit limit=1 und ohne BBox-Filter)
    $query_params = [
        'q' => $query, 
        'apiKey' => HERE_API_KEY,
        'limit' => 1, // Wichtig: Zurück auf limit=1 für die einfache Validierung
        // 'in' => 'bbox:13.0,52.3,13.8,52.6', // Die BBox wurde entfernt
    ];

    $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 (einfach, limit=1): " . $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'])) {
        // Da limit=1 gesetzt ist, läuft die Schleife maximal einmal
        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) ---
            // Dieser Filter könnte bei limit=1 Ergebnisse außerhalb Berlins fälschlicherweise ausschließen, 
            // wenn die Query nicht Berlin-spezifisch ist. Behält aber die Struktur.
            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);

    // JSON_PRETTY_PRINT für bessere Lesbarkeit im Terminal
    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. Diese Datei dient der HERE Geocoding Validierung mittels Suchstring.']);
}

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