---
name: build_guide_prompt
kind: function
lang: kt
domain: core
version: "1.0.0"
purity: pure
signature: "fun buildGuidePrompt(location: Map<String, String>, pois: List<Map<String, Any>>, interests: List<Interest>, userQuery: String = \"\", lang: String = \"es\"): List<ChatMessage>"
description: "Construye un prompt contextual para el LLM como guía local combinando ubicación actual, POIs cercanos rankeados e intereses del usuario. Puerto Kotlin de build_guide_prompt_py_core. Retorna exactamente 2 mensajes: system y user en formato OpenAI/Ollama."
tags: [llm, prompt, guide, location, poi, chat, openai, ollama, voice]
params:
  - name: location
    desc: "Mapa con info de ubicación de nominatim reverse geocode. Campos: display_name, neighbourhood, suburb, city, town, village, country, etc."
  - name: pois
    desc: "Lista de POIs rankeados (máx 5 se usan). Cada mapa: name, category, score, matched_interests (List<String>), lat, lon."
  - name: interests
    desc: "Lista de objetos Interest con name, keywords y weight. Determina el foco del sistema prompt."
  - name: userQuery
    desc: "Pregunta libre del usuario. Si vacía, se usa '¿Qué me puedes contar de esta zona?' como default."
  - name: lang
    desc: "Código de idioma para la respuesta del LLM (ej: 'es', 'en', 'fr')."
output: "Lista de exactamente 2 ChatMessage: [system, user]. System describe el rol de guía con ciudad e intereses. User incluye ubicación GPS, barrio, POIs relevantes y la query del usuario."
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
tested: false
tests: []
test_file_path: ""
file_path: "kotlin/functions/core/build_guide_prompt.kt"
---

## Ejemplo

```kotlin
val location = mapOf(
    "display_name" to "Calle Mayor, 1, Madrid, España",
    "neighbourhood" to "Centro",
    "city" to "Madrid"
)

val pois = listOf(
    mapOf(
        "name" to "Museo del Prado",
        "category" to "museum",
        "score" to 0.95,
        "matched_interests" to listOf("arte", "historia")
    )
)

val interests = listOf(
    Interest(name = "arte", keywords = listOf("pintura", "escultura"), weight = 1.0),
    Interest(name = "historia", keywords = listOf("medieval", "siglo XIX"), weight = 0.8)
)

val messages = buildGuidePrompt(
    location = location,
    pois = pois,
    interests = interests,
    userQuery = "¿Cuándo abre el Prado?",
    lang = "es"
)

// messages[0].role == "system"
// messages[1].role == "user"
// messages[1].content contiene "Museo del Prado (museum) — relevante para: arte, historia"
```

## Notas

Puerto directo de `build_guide_prompt_py_core` al idioma Kotlin.

Define dos data classes auxiliares en el mismo archivo:
- `Interest(name, keywords, weight)` — interés del usuario
- `ChatMessage(role, content)` — mensaje en formato OpenAI/Ollama

Comportamiento idéntico al original Python:
- `city` se extrae con fallback: `city` → `town` → `village` → "tu zona"
- `neighbourhood` incluye fallback a `suburb`
- Máximo 5 POIs en el user message
- Omite línea de barrio si neighbourhood y ciudad están vacíos
- Omite sección POIs si la lista está vacía
- Omite `display_name` si está vacío

Función pura: sin I/O, sin estado mutable, determinista.
