import openai, os, chromadb, numpy as np, json, struct, time, subprocess
from urllib.error import URLError

openai.api_key = os.getenv("OPENAI_API_KEY")

CHROMA_HOST = os.getenv("CHROMA_HOST", "localhost")
CHROMA_PORT = int(os.getenv("CHROMA_PORT", 8000))

# 🔧 Verifica se Chroma è attivo, altrimenti lo avvia
def ensure_chroma_running():
    try:
        chroma = chromadb.HttpClient(host=CHROMA_HOST, port=CHROMA_PORT)
        chroma.heartbeat()
        return chroma
    except Exception:
        print(f"[INFO] ChromaDB non risponde. Avvio processo su {CHROMA_HOST}:{CHROMA_PORT}...")
        subprocess.Popen(["chroma", "run", "--host", CHROMA_HOST, "--port", str(CHROMA_PORT)],
                         stdout=subprocess.DEVNULL,
                         stderr=subprocess.DEVNULL)
        for _ in range(20):
            try:
                chroma = chromadb.HttpClient(host=CHROMA_HOST, port=CHROMA_PORT)
                chroma.heartbeat()
                print("[INFO] ChromaDB avviato correttamente.")
                return chroma
            except Exception:
                time.sleep(0.5)
        raise RuntimeError("❌ Impossibile avviare ChromaDB.")

chroma = ensure_chroma_running()
cases = chroma.get_or_create_collection("case_studies")

def embed(text: str) -> list[float]:
    return openai.embeddings.create(
        model="text-embedding-3-small",
        input=text
    ).data[0].embedding

def narrative(table: list[dict]) -> tuple[str, list[str]]:
    # 1. Costruzione query di embedding
    query = "; ".join(f"{row['label']}={row['company']}{row['unit']}" for row in table)
    emb = embed(query)

    # 2. Recupero documenti simili
    simil = cases.query(query_embeddings=[emb], n_results=4)
    ids = simil["ids"][0]  # Manteniamo come stringhe
    context = "\n".join(simil["documents"][0])

    # 3. Prompt GPT
    sys = "Sei un esperto di consulenza HR e organizzativa. Il tuo compito è generare un'analisi professionale basata sui KPI aziendali forniti e confrontarli con benchmark tratti da casi studio simili."

    usr = f"""
Analizza i seguenti dati aziendali e genera una breve relazione descrittiva:

📊 **Dati aziendali e KPI** (valori attuali):
{json.dumps(table, ensure_ascii=False, indent=2)}

📚 **Casi studio simili**:
{context}

✍️ **Obiettivo**:
1. Riconosci i punti di forza e debolezza.
2. Evidenzia le aree in cui l'azienda è sopra o sotto il benchmark.
3. Proponi spunti per migliorare in ottica Smart Week (es. settimana corta, benessere, produttività).

Scrivi in tono professionale ma accessibile, come se stessi preparando un commento per un cliente aziendale.
"""

    rsp = openai.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": sys},
            {"role": "user", "content": usr}
        ],
        temperature=0.3
    )

    return rsp.choices[0].message.content, ids
