---
name: match_pois_to_interests
kind: function
lang: py
domain: core
version: "1.0.0"
purity: pure
signature: "def match_pois_to_interests(pois: list[dict], interests: list[dict], max_results: int = 10) -> list[dict]"
description: "Filtra y rankea una lista de POIs segun un perfil de intereses del usuario. Calcula un score por categoria (0.5), nombre (0.3) y tags (0.2), multiplicado por el weight del interes. Retorna los top max_results POIs con score > 0, enriquecidos con score y matched_interests."
tags: [poi, ranking, filtering, interests, geospatial, recommendation, pure]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
params:
  - name: pois
    desc: "Lista de POIs, cada uno con campos id, lat, lon, name, category y tags (dict). Formato compatible con la salida de overpass_nearby_pois."
  - name: interests
    desc: "Lista de intereses del usuario, cada uno con name (str), keywords (list[str]) y weight (float entre 0 y 1). Los keywords se comparan contra categoria, nombre y tags del POI."
  - name: max_results
    desc: "Numero maximo de POIs a retornar. Por defecto 10."
output: "Lista de POIs filtrados y ordenados por score descendente. Cada POI incluye todos sus campos originales mas score (float) y matched_interests (list[str] con los nombres de intereses que matchearon). Lista vacia si ningun POI supera score 0."
tested: true
tests:
  - "pois que matchean parcialmente por categoria y nombre"
  - "pois sin match retorna lista vacia"
  - "multiples intereses con diferentes weights acumulan score"
test_file_path: "python/functions/core/match_pois_to_interests_test.py"
file_path: "python/functions/core/match_pois_to_interests.py"
---

## Ejemplo

```python
pois = [
    {"id": 1, "lat": 40.41, "lon": -3.70, "name": "Museo del Prado", "category": "museum", "tags": {"tourism": "museum"}},
    {"id": 2, "lat": 40.42, "lon": -3.71, "name": "Bar El Tigre", "category": "bar", "tags": {"amenity": "bar"}},
]
interests = [{"name": "arte", "keywords": ["museo", "museum", "arte"], "weight": 1.0}]
result = match_pois_to_interests(pois, interests)
# [{"id": 1, ..., "score": 1.0, "matched_interests": ["arte"]}]
```

## Notas

Funcion pura: no hace I/O, no muta los inputs, es determinista.

**Calculo de score por interes:**
- Match de categoria: 0.5 si `poi["category"]` esta en los keywords del interes
- Match de nombre: 0.3 si algun keyword aparece como substring en `poi["name"]` (case-insensitive)
- Match de tags: 0.2 si algun keyword aparece en los valores de `poi["tags"]` (case-insensitive)
- El subtotal del interes se multiplica por `weight`

Si un POI matchea multiples intereses, los scores se suman. Un POI puede obtener score maximo de `sum(weight_i * 1.0)` sobre todos los intereses que matcheen.

El campo `tags` puede ser dict con valores string o numericos — todos se convierten a string para la comparacion.
