"""Construye un prompt contextual para el LLM combinando ubicación, POIs e intereses del usuario."""


def build_guide_prompt(
    location: dict,
    pois: list[dict],
    interests: list[dict],
    user_query: str = "",
    lang: str = "es",
) -> list[dict]:
    """Construye un prompt contextual para el LLM como guía local.

    Combina la ubicación actual del usuario, POIs cercanos rankeados por relevancia
    e intereses del usuario para generar mensajes en formato OpenAI/Ollama.

    Args:
        location: Dict con info de ubicación de nominatim_reverse_geocode.
                  Campos esperados: display_name, street, neighbourhood, city, country, etc.
        pois: Lista de POIs rankeados con campos: name, category, score,
              matched_interests, lat, lon, tags. Ya filtrados y ordenados por score.
        interests: Lista de intereses del usuario. Cada uno con: name, keywords, weight.
        user_query: Pregunta opcional del usuario. Si está vacía, se usa un default.
        lang: Idioma para la respuesta del LLM (ej: "es", "en", "fr").

    Returns:
        Lista de mensajes en formato OpenAI/Ollama:
        [{"role": "system", "content": "..."}, {"role": "user", "content": "..."}]
    """
    # Extraer nombre de intereses para el system prompt
    interest_names = [i.get("name", "") for i in interests if i.get("name")]
    interests_str = ", ".join(interest_names) if interest_names else "lugares de interés general"

    # Extraer ciudad para el system prompt
    city = location.get("city", "") or location.get("town", "") or location.get("village", "") or "la zona"

    # Construir system message
    system_content = (
        f"Eres un guía local experto y amigable. El usuario está caminando por {city} "
        f"y le interesan: {interests_str}.\n"
        "Tu objetivo es informar sobre lo que hay cerca, dar contexto histórico/cultural "
        "relevante a sus intereses, y sugerir qué visitar.\n"
        f"Responde en {lang}. Sé conciso (máximo 3-4 frases) y conversacional, "
        "como si caminaras junto al usuario.\n"
        "Si no hay POIs relevantes, comenta sobre el barrio o zona."
    )

    # Construir user message
    user_parts = []

    # Ubicación
    display_name = location.get("display_name", "")
    if display_name:
        user_parts.append(f"📍 Estoy en: {display_name}")

    neighbourhood = location.get("neighbourhood", "") or location.get("suburb", "")
    city_label = location.get("city", "") or location.get("town", "") or location.get("village", "")
    location_line_parts = [p for p in [neighbourhood, city_label] if p]
    if location_line_parts:
        user_parts.append(f"Barrio: {', '.join(location_line_parts)}")

    # POIs (máximo 5)
    top_pois = pois[:5]
    if top_pois:
        user_parts.append("")
        user_parts.append("Lugares cercanos que me pueden interesar:")
        for poi in top_pois:
            name = poi.get("name", "Sin nombre")
            category = poi.get("category", "")
            matched = poi.get("matched_interests", [])
            matched_str = ", ".join(matched) if matched else ""

            poi_line = f"- {name}"
            if category:
                poi_line += f" ({category})"
            if matched_str:
                poi_line += f" — relevante para: {matched_str}"
            user_parts.append(poi_line)

    # Query del usuario
    user_parts.append("")
    if user_query and user_query.strip():
        user_parts.append(user_query.strip())
    else:
        user_parts.append("¿Qué me puedes contar de esta zona?")

    user_content = "\n".join(user_parts)

    return [
        {"role": "system", "content": system_content},
        {"role": "user", "content": user_content},
    ]
