"""
Recherche dans le CSV local des entreprises de Bessèges.
Chargé une seule fois en mémoire au démarrage via @lru_cache.

CSV: data/documents/besseges_entreprises.csv
Colonnes: nom_entreprise, adresse_complete, codePostalEtablissement,
          libelleCommuneEtablissement, siret, enseigne1Etablissement,
          denominationUsuelleEtablissement
"""
import csv
import re
import logging
from pathlib import Path
from functools import lru_cache

log = logging.getLogger("icac.csv_entreprises")

CSV_PATH = Path(__file__).parent.parent / "data" / "documents" / "besseges_entreprises.csv"


@lru_cache(maxsize=1)
def load_entreprises() -> tuple:
    """
    Charge le CSV en mémoire une seule fois.
    Retourne un tuple de dicts (hashable pour lru_cache).
    """
    csv_file = CSV_PATH
    if not csv_file.exists():
        # Chercher tout CSV dans data/documents/
        candidates = list(
            (Path(__file__).parent.parent / "data" / "documents").glob("*.csv")
        )
        if not candidates:
            log.warning("Aucun CSV entreprises trouvé")
            return ()
        csv_file = candidates[0]
        log.info("CSV entreprises: %s", csv_file)

    rows = []
    try:
        with open(csv_file, encoding="utf-8-sig", newline="") as f:
            reader = csv.DictReader(f)
            for row in reader:
                rows.append(dict(row))
        log.info(
            "CSV chargé: %d entreprises, colonnes: %s",
            len(rows),
            list(rows[0].keys()) if rows else []
        )
    except Exception as e:
        log.error("Lecture CSV: %s", e)
    return tuple(rows)


def search_entreprises(query: str, max_results: int = 8) -> str:
    """
    Recherche dans le CSV entreprises.
    Retourne texte structuré pour Groq.
    """
    entreprises = load_entreprises()
    if not entreprises:
        return ""

    query_low = query.lower()

    # Extraire mots-clés de la query
    stopwords = {
        "les", "des", "une", "quel", "quelle", "quelles",
        "entreprise", "société", "commerce", "liste",
        "bessèges", "besseges", "commune", "mairie", "qui", "est",
        "gérant", "dirigeant", "patron", "quels", "sont",
        "dans", "sur", "pour", "tous", "toutes", "actives",
    }
    keywords = [
        w for w in re.findall(
            r'\b[a-zàâéèêëîïôùûüç]{3,}\b', query_low
        )
        if w not in stopwords
    ]

    results = []

    for e in entreprises:
        # Construire une chaîne searchable depuis toutes les colonnes
        searchable = " ".join(
            str(v).lower() for v in e.values()
        )

        # Scorer la pertinence
        score = sum(
            1 for kw in keywords
            if kw in searchable
        )

        # Inclure si au moins un keyword matche
        if score > 0:
            results.append((score, e))

    # Trier par score décroissant + dédupliquer par SIRET
    results.sort(key=lambda x: x[0], reverse=True)
    seen_siret = set()
    top = []
    for _, e in results:
        siret = e.get("siret", "")
        if siret in seen_siret:
            continue
        seen_siret.add(siret)
        top.append(e)
        if len(top) >= max_results:
            break

    if not top:
        # Si aucun résultat ciblé → retourner un échantillon dédupliqué
        seen2 = set()
        sample = []
        for e in entreprises:
            s = e.get("siret", "")
            if s not in seen2:
                seen2.add(s)
                sample.append(e)
            if len(sample) >= 5:
                break
        top = sample
        prefix = (
            f"Aucune entreprise trouvée pour '{query}'. "
            f"Échantillon des {len(entreprises)} entreprises de Bessèges :\n"
        )
    else:
        prefix = (
            f"{len(top)} entreprise(s) trouvée(s) "
            f"parmi {len(entreprises)} pour '{query}' :\n"
        )

    # Formater pour Groq — colonnes réelles du CSV
    lines = [prefix]
    for e in top:
        nom = (
            e.get("nom_entreprise", "")
            or e.get("denominationUsuelleEtablissement", "")
            or e.get("enseigne1Etablissement", "")
        )
        siret = e.get("siret", "N/A")
        adresse = e.get("adresse_complete", "N/A")
        cp = e.get("codePostalEtablissement", "")
        ville = e.get("libelleCommuneEtablissement", "")
        enseigne = e.get("enseigne1Etablissement", "")
        denom = e.get("denominationUsuelleEtablissement", "")

        addr_full = f"{adresse}, {cp} {ville}".strip(", ")

        lines.append(
            f"■ {nom or '(nom inconnu)'}\n"
            f"  SIRET    : {siret}\n"
            f"  Adresse  : {addr_full}\n"
            + (f"  Enseigne : {enseigne}\n" if enseigne and enseigne != nom else "")
            + (f"  Dénomination: {denom}\n" if denom and denom != nom else "")
            + f"  Source   : CSV local Bessèges"
        )

    return "\n\n".join(lines)
