import json
import os
from utils.utils import get_aversion_color, get_qualitative_aversion
RESOURCE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "resources")
with open(os.path.join(RESOURCE_DIR, "aversions.json"), "r") as f:
aversions_data = json.load(f)
AVERSIONS = {item["Name"]: item for item in aversions_data}
def create_poi_html(poi: dict, user_id: str) -> str:
"""Create HTML representation of a POI with sensory features"""
html = f"""
{poi["name:token_seq"]}
Descrizione: {poi["description:token_seq"]}
Luogo: {poi["address:token_seq"]}
Caratteristiche Sensoriali:
| Caratteristica |
Livello (1-5) |
"""
for feature, level in poi["sensory_features:token"].items():
icon = AVERSIONS[feature]["Icon"]
bar_color = get_aversion_color(level, AVERSIONS[feature]["Type"])
html += f"""
|
{icon}
{feature}
|
|
"""
html += f"""
Spiegazione della raccomandazione: ti suggeriamo questo luogo perchΓ© ...
{poi["explanation"]}
"""
return html
def create_recommendation_item(rec, index, selected=False) -> str:
"""Create HTML for a single recommendation item"""
poi_category = ' - '.join(rec["category:token_seq"]).replace('_', ' ')
return f"""
{rec["name:token_seq"]}
{rec["description:token_seq"] or ''}
{'π·οΈ ' + poi_category if poi_category else ''}
{"β" if selected else ""}
"""
def create_poi_card_selectable(poi: dict, is_selected: bool = False) -> str:
"""Create HTML representation of a selectable POI card for search interface"""
# Enhanced visual feedback based on selection state
if is_selected:
border_color = "#30892F"
background_color = "#f0f8f0" # Slightly darker green tint
tick_icon = "β"
# Dark overlay for selected state
overlay_style = "background-color: rgba(0, 0, 0, 0.15);"
# Darker content background
content_bg = "#e8f5e8"
# Darker text colors for selected state
title_color = "#2c5530"
location_color = "#4a5c4d"
category_color = "#5a6b5d"
else:
border_color = "#ddd"
background_color = "white"
tick_icon = ""
overlay_style = ""
content_bg = "white"
title_color = "#333"
location_color = "#666"
category_color = "#777"
# Create compact sensory features display
sensory_html = ""
if poi.get("sensory_features"):
sensory_items = []
for feature, level in poi["sensory_features"].items():
icon = AVERSIONS[feature]["Icon"]
color = get_aversion_color(level, AVERSIONS[feature]["Type"])
qualitative_level = get_qualitative_aversion(
level, AVERSIONS[feature]["Type"]
)
qualitative_level = {"GOOD": "Basso", "ACCEPTABLE": "Medio", "BAD": "Alto"}[
qualitative_level
]
sensory_items.append(
f'{icon} {feature}: {qualitative_level}'
)
sensory_html = f"""
Caratteristiche Sensoriali:
"""
# Escape single quotes in POI name for JavaScript
poi_id_escaped = poi["poi_id:token"].replace(" ", "-").replace("'", "").replace('"', "")
poi_category = ' - '.join(poi["category:token_seq"]).replace('_', ' ')
html = f"""
{tick_icon}
{poi["name:token_seq"]}
π {poi["address:token_seq"]}
{'π·οΈ ' + poi_category if poi_category else ''}
{sensory_html}
{("β Selezionato" if is_selected else "Clicca per selezionare")}
"""
return html
def create_poi_cards_list(pois: list, selected_pois: set) -> str:
if not pois:
return "π Nessun punto di interesse trovato
Prova con termini di ricerca diversi
"
# Genera HTML per i POI filtrati
poi_cards_html = []
for poi in pois:
is_selected = (poi.get("poi_id:token"), poi.get("name:token_seq")) in selected_pois
card_html = create_poi_card_selectable(poi, is_selected)
poi_cards_html.append(card_html)
html = f"""
{"".join(poi_cards_html)}
Trovati {len(pois)} punti di interesse β’ {len(selected_pois)} selezionati
"""
return html