"""地点模型:World 的空间骨架。

先用"地点图"(命名地点 + 邻接)而非完整 tile 网格——足够支撑移动/感知/社交,
且能承载丰富要素(图书馆/市政府/咖啡馆…)。tile 级寻路留给可视化阶段。
地点/对象都可热加载(WorldMap.add),对应 PRD §7 可扩展性。
"""

from __future__ import annotations

from dataclasses import dataclass, field


@dataclass
class WorldObject:
    """地点里的物体,affordances 描述"能对它做什么"(供 agent 感知)。"""

    name: str
    affordances: list[str] = field(default_factory=list)


@dataclass
class Place:
    name: str
    description: str = ""
    objects: list[WorldObject] = field(default_factory=list)
    adjacent: list[str] = field(default_factory=list)  # 可直接前往的地点名

    def object_names(self) -> list[str]:
        return [o.name for o in self.objects]


class WorldMap:
    def __init__(self, places: list[Place] | None = None) -> None:
        self._places: dict[str, Place] = {p.name: p for p in (places or [])}

    def has(self, name: str) -> bool:
        return name in self._places

    def get(self, name: str) -> Place | None:
        return self._places.get(name)

    def add(self, place: Place) -> None:
        self._places[place.name] = place

    def names(self) -> list[str]:
        return list(self._places)
