"""
Search Agent — Ricerca prodotti nel catalogo.

Pipeline in 3 fasi:
1. TRADUZIONE: la query italiana viene tradotta in keyword inglesi dall'LLM
   (il catalogo Amazon e' in inglese)
2. RICERCA: le keyword vengono cercate nell'indice FAISS prodotti (k=20)
3. RISPOSTA: l'LLM filtra i risultati pertinenti e genera una risposta in italiano

Totale: 2 chiamate LLM per ciclo (traduzione + risposta).

Usa il factory pattern: create_nodo_ricerca(llm, product_retriever) → funzione nodo.
"""

from langchain_core.messages import AIMessage


def create_nodo_ricerca(llm, product_retriever):
    """Crea il nodo Search Agent con le dipendenze iniettate.

    Args:
        llm: istanza ChatOpenAI per traduzione e generazione risposta
        product_retriever: retriever FAISS del catalogo prodotti (100k items)
    """
    def nodo_ricerca(state):
        print("--- [AGENT RICERCA] 1. Traduzione Query... ---")

        if not product_retriever:
            return {"messages": [AIMessage(content="Errore: Il catalogo prodotti non e' disponibile.")]}

        # Usa la query risolta dal Router (con contesto), fallback all'ultimo messaggio
        user_query = state.get("resolved_query", state["messages"][-1].content)

        # --- FASE 1: Traduzione IT → EN ---
        try:
            translation_prompt = f"""Task: Translate search query to English keywords for Amazon.
        Input: "{user_query}"
        Output keywords only:"""
            english_query_msg = llm.invoke(translation_prompt)
            english_query = english_query_msg.content.strip()
            print(f"   Originale: '{user_query}' -> Ricerca interna: '{english_query}'")
        except:
            english_query = user_query

        # --- FASE 2: Ricerca FAISS ---
        print("--- [AGENT RICERCA] 2. Interrogazione Catalogo... ---")
        results = product_retriever.invoke(english_query)

        # Formatta i risultati per il prompt LLM
        products_text = ""
        for doc in results:
            meta = doc.metadata
            img_info = "Si" if meta.get('image_url') else "No"
            products_text += f"- Title: {meta.get('title')} | Price: {meta.get('price')} | Image: {img_info}\n"

        # --- FASE 3: Generazione risposta in italiano ---
        print("--- [AGENT RICERCA] 3. Generazione Risposta... ---")

        prompt = f"""Sei un personal shopper. Seleziona SOLO i prodotti pertinenti alla richiesta dell'utente e rispondi in italiano.

Query Utente: "{user_query}"
Prodotti Trovati (inglese):
{products_text}

FORMATO RISPOSTA (NO MARKDOWN, NO ASTERISCHI):
Ecco i prodotti trovati:

1. Nome Prodotto (Brand) - Prezzo: $XX.XX
2. Nome Prodotto (Brand) - Prezzo: $XX.XX
...

Regole:
- Lista numerata semplice (1. 2. 3. ...)
- NO markdown bold (**), NO asterischi
- Se brand mancante o "Generic", omettilo
- Se prezzo mancante o "N/A", omettilo
- Se non trovi prodotti pertinenti, scrivi "Non ho trovato prodotti che corrispondono alla tua richiesta."
"""

        response = llm.invoke(prompt)
        return {"messages": [response]}

    return nodo_ricerca
