"""Suchservice - Wrapper um search.py mit Gruppierung und Filtern."""

from sqlalchemy.orm import Session

from models.gruppe import KontaktGruppe
from models.kontakt import Kontakt
from models.tag import KontaktTag
import search as search_module


def live_suche(db: Session, query: str, limit: int = 10):
    """Live-Suche fuer HTMX Dropdown (max 10 Ergebnisse)."""
    ergebnisse = search_module.search(db, query, limit=limit * 2)
    blacklisted_ids = {r[0] for r in db.query(Kontakt.id).filter(Kontakt.ist_blacklisted == True).all()}
    ergebnisse = [e for e in ergebnisse if not (e["entity_type"] == "kontakt" and e["entity_id"] in blacklisted_ids)]
    return ergebnisse[:limit]


def volle_suche(
    db: Session,
    query: str,
    entity_type: str = None,
    limit: int = 50,
    gruppe_id: int = None,
    tag_id: int = None,
    ort: str = None,
):
    """Volle Suche mit optionalem Typ-Filter und erweiterten Filtern."""
    ergebnisse = search_module.search(db, query, limit=limit * 3, entity_type=entity_type)

    # Blacklisted Kontakte ausfiltern
    blacklisted_ids = {r[0] for r in db.query(Kontakt.id).filter(Kontakt.ist_blacklisted == True).all()}
    ergebnisse = [e for e in ergebnisse if not (e["entity_type"] == "kontakt" and e["entity_id"] in blacklisted_ids)]

    # Erweiterte Filter nur auf Kontakte anwendbar
    if gruppe_id or tag_id or ort:
        erlaubte_kontakt_ids = None

        if gruppe_id:
            ids = {r[0] for r in db.query(KontaktGruppe.kontakt_id).filter(KontaktGruppe.gruppe_id == gruppe_id).all()}
            erlaubte_kontakt_ids = ids if erlaubte_kontakt_ids is None else erlaubte_kontakt_ids & ids

        if tag_id:
            ids = {r[0] for r in db.query(KontaktTag.kontakt_id).filter(KontaktTag.tag_id == tag_id).all()}
            erlaubte_kontakt_ids = ids if erlaubte_kontakt_ids is None else erlaubte_kontakt_ids & ids

        if ort:
            ids = {r[0] for r in db.query(Kontakt.id).filter(Kontakt.ort.ilike(f"%{ort}%")).all()}
            erlaubte_kontakt_ids = ids if erlaubte_kontakt_ids is None else erlaubte_kontakt_ids & ids

        if erlaubte_kontakt_ids is not None:
            gefiltert = []
            for erg in ergebnisse:
                if erg["entity_type"] == "kontakt":
                    if erg["entity_id"] in erlaubte_kontakt_ids:
                        gefiltert.append(erg)
                else:
                    gefiltert.append(erg)
            ergebnisse = gefiltert

    return gruppiere_ergebnisse(ergebnisse[:limit])


def gruppiere_ergebnisse(ergebnisse: list) -> dict:
    """Ergebnisse nach Entity-Typ gruppieren."""
    gruppiert = {
        "kontakt": [],
        "aktivitaet": [],
        "veranstaltung": [],
        "kampagne": [],
    }
    for erg in ergebnisse:
        typ = erg["entity_type"]
        if typ in gruppiert:
            gruppiert[typ].append(erg)
    return gruppiert
