// addrs-ui-render-results.js

import { mylog } from "./sc-utilities";

/**
 * Wählt die Font Awesome Icon-Klasse basierend auf der Datenquelle.
 * @param {string | null} source - Die Datenquelle (z.B. 'POI', 'HERE', 'OSM').
 * @returns {string} Die CSS-Klasse für das Icon oder ein leerer String, wenn die Quelle fehlt.
 */
function getSourceIconClass(source) {
    // Gibt einen leeren String zurück, wenn die Quelle fehlt oder leer ist.
    if (!source || source.trim() === '') {
        return ''; 
    }

    const lowerSource = source.toLowerCase();

    switch (lowerSource) {
        case 'poi':
            return 'fas fa-user'; // Icon für Points of Interest / Namenssuchen
        case 'here':
            return 'fas fa-external-link-alt'; // Icon für externe HERE-Quelle
        case 'osm':
        case 'nominatim': 
            return 'fas fa-globe'; // Icon für OpenStreetMap-Daten
        default:
            return 'fas fa-map-marker-alt'; // Standard-Icon, falls Quelle unbekannt, aber vorhanden
    }
}

// ⭐ NEU: HILFSFUNKTION FÜR KANONISCHE SCHLÜSSEL (Duplikatsprüfung) ⭐
/**
 * Erzeugt einen kanonischen Schlüssel aus Adressbestandteilen zur Duplikatsprüfung.
 * @param {string} street
 * @param {string} houseNr
 * @param {string} district
 * @returns {string} Ein konsistenter, normalisierter Schlüssel (z.B. "musterstrasse5friedenau").
 */
function createCanonicalAddressKey(street, houseNr, district) {
    if (!street && !houseNr) {
        return '';
    }

    // 1. Alles in Kleinbuchstaben
    let key = `${street} ${houseNr} ${district}`.toLowerCase();
    
    // 2. Abkürzungen/Variationen vereinheitlichen
    key = key.replace(/str\./g, 'strasse');
    key = key.replace(/allee\s/g, 'allee');
    key = key.replace(/damm\s/g, 'damm');
    
    // 3. Leerzeichen und Bindestriche entfernen
    key = key.replace(/[-\s]/g, '');

    return key;
}
// ⭐ ENDE HILFSFUNKTION ⭐

export function renderAddressSheetResults(dynamicResultsContainer, addressSearchInput, data) {
    mylog('DEBUG (ui.js): Daten in renderResults empfangen:', data);

    if (!dynamicResultsContainer) {
        console.error("FEHLER: dynamicResultsContainer wurde NICHT gefunden.");
        return;
    }

    // ✅ KEINE MAGIC NUMBER: Wir leeren den Container restlos.
    // Die Action-Buttons (Standort, Pflegebedarf) liegen SoC-konform 
    // in einer anderen Liste oder einem übergeordneten Container.
    dynamicResultsContainer.innerHTML = '';

    // 1. Fall: Keine Daten oder Suche zu kurz
    if (!Array.isArray(data) || data.length === 0) {
        const query = addressSearchInput.value.trim();
        // Nur wenn der User aktiv sucht (mind. 3 Zeichen), zeigen wir "Keine Treffer"
        if (query.length >= 3) {
            const noResultsLi = document.createElement('li');
            noResultsLi.innerHTML = '<p style="text-align: center; color: #888; padding: 20px;">Keine Ergebnisse gefunden.</p>';
            dynamicResultsContainer.appendChild(noResultsLi);
        }
        return;
    }

    // 2. Fall: Status-Infos oder direkte HERE-Treffer
    if (data.length === 1 && (data[0].type === 'here_specific' || data[0].type === 'info')) {
        const feature = data[0];
        if (feature.type === 'info') {
            const infoLi = document.createElement('li');
            infoLi.innerHTML = feature.display_name;
            dynamicResultsContainer.appendChild(infoLi);
            return;
        }
        if (feature.type === 'here_specific') {
            const iconClass = getSourceIconClass('HERE');
            const li = createResultListItem(iconClass, feature.display_name, {
                lat: feature.lat, lng: feature.lng, source: 'HERE',
                displayName: feature.display_name, textToDisplay: feature.display_name
            });
            dynamicResultsContainer.appendChild(li);
            return;
        }
    }

    // 3. Fall: Reguläre Ergebnisse (POI, OSM, HERE)
    const uniqueAndProcessedResults = [];
    const displayedCanonicalKeys = new Set();
    
    data.forEach(feature => {
        const road = feature.street || '';
        const houseNumber = feature.houseNr || '';
        const district = feature.district || '';
        
        // Duplikatsprüfung
        const canonicalKey = createCanonicalAddressKey(road, houseNumber, district);
        if (canonicalKey && displayedCanonicalKeys.has(canonicalKey)) return;
        if (canonicalKey) displayedCanonicalKeys.add(canonicalKey);

        // Text-Formatierung
        let textToDisplay = '';
        if (feature.source === "POI") {
            textToDisplay = feature.display_name;
        } else {
            let parts = [];
            if (road) parts.push(houseNumber ? `${road} ${houseNumber}` : road);
            else if (houseNumber) parts.push(houseNumber);
            if (district) parts.push(district);
            if (feature.postcode) parts.push(feature.postcode);
            textToDisplay = parts.length > 0 ? parts.join(', ') : (feature.display_name || 'Unbekannte Adresse');
        }

        uniqueAndProcessedResults.push({
            gid: parseInt(feature.gid) || '',
            lat: parseFloat(feature.lat),
            lng: parseFloat(feature.lng),
            street: road,
            houseNr: houseNumber,
            displayName: feature.display_name,
            textToDisplay,
            source: feature.source || null,
            poi_count: feature.poi_count || null,
            aggregated_names: feature.aggregated_names || null
        });
    });

    // Sortierung
    uniqueAndProcessedResults.sort((a, b) => {
        const getSortValue = (s) => (s === 'POI' ? 1 : s === 'HERE' ? 2 : 3);
        const diff = getSortValue(a.source) - getSortValue(b.source);
        return diff !== 0 ? diff : a.textToDisplay.localeCompare(b.textToDisplay);
    });

    // DOM-Erstellung
    uniqueAndProcessedResults.forEach(item => {
        const iconClass = getSourceIconClass(item.source); 
        const li = createResultListItem(iconClass, item.textToDisplay, item);
        dynamicResultsContainer.appendChild(li);
    });
}


/**
 * Erstellt und gibt ein Listenelement für ein Adressergebnis zurück.
 * @param {string} iconClass - Font Awesome Klasse für das Icon (z.B. 'fas fa-map-marker-alt'). Kann auch leer sein.
 * @param {string} displayName - Der anzuzeigende Text.
 * @param {Object} dataset - Ein Objekt mit Datenattributen (z.B. { lat, lng, displayName }).
 * @returns {HTMLLIElement} Das erstellte Listenelement.
 * @private
 */
function createResultListItem(iconClass, displayName, dataset = {}) {
    const li = document.createElement('li');
    li.classList.add('sc-address-result-item');

    for (const key in dataset) {
        // Prüft auf null oder undefined, um Fehler bei leeren Werten zu vermeiden
        if (Object.prototype.hasOwnProperty.call(dataset, key) && dataset[key] !== null && dataset[key] !== undefined) {
            li.dataset[key] = dataset[key];
        }
    }

    // Setzt das Icon und den Text
    li.innerHTML = `
            <div class="sc-address-result-icon"><i class="${iconClass}"></i></div>
            <div class="sc-address-result-text">
                <div class="sc-address-result-line">${displayName}</div>
            </div>
        `;
    return li;
}