from genesis.memory.importance import HeuristicImportanceScorer
from genesis.memory.local_store import LocalMemoryStore
from genesis.memory.record import MemoryKind
from genesis.memory.stream import MemoryStream


def make_stream():
    return MemoryStream(LocalMemoryStore(), agent_id="alice")


def test_observe_assigns_id_and_importance():
    s = make_stream()
    rec = s.observe("Alice cooked breakfast", now=8.0)
    assert rec.id is not None
    assert 0.0 <= rec.importance <= 1.0
    assert rec.created_at == 8.0


def test_retrieve_finds_relevant_memory():
    s = make_stream()
    s.observe("Alice loves spicy noodles", now=8.0)
    s.observe("Bob fixed the fence", now=9.0)
    out = s.retrieve("what food does Alice like", now=10.0, top_k=1)
    assert out
    assert "noodles" in out[0].content


def test_retrieve_updates_last_accessed():
    s = make_stream()
    rec = s.observe("Alice met Bob at the cafe", now=8.0)
    assert rec.last_accessed == 8.0
    s.retrieve("Bob cafe", now=20.0, top_k=1)
    assert rec.last_accessed == 20.0  # 被回忆后刷新新近度


def test_heuristic_importance_milestone_higher():
    scorer = HeuristicImportanceScorer()
    assert scorer.score("Alice got married today") > scorer.score("Alice walked to the park")


def test_empty_content_zero_importance():
    assert HeuristicImportanceScorer().score("   ") == 0.0


def test_isolation_between_agents():
    store = LocalMemoryStore()
    a = MemoryStream(store, "alice")
    b = MemoryStream(store, "bob")
    a.observe("Alice secret diary entry", now=1.0)
    assert b.retrieve("diary", now=2.0) == []  # bob 取不到 alice 的记忆


def test_reflection_kind_stored():
    s = make_stream()
    rec = s.observe("I value honesty above all", now=12.0, kind=MemoryKind.REFLECTION, importance=0.9)
    assert rec.kind == MemoryKind.REFLECTION
    assert rec.importance == 0.9
