"""两轮售后上下文示例。没有真实模型、网络调用、退款或持久化写入。"""
from dataclasses import asdict
from datetime import datetime, timezone
import json

from context_pipeline import AssemblyError, Principal, assemble, fixture
from state_transitions import TaskState, apply_pickup, save
from compaction_snapshot import snapshot, validate_summary
from memory_lifecycle import MemoryStore
from cache_versions import Cache, Key


def main() -> None:
    principal = Principal("shop-a", "user-417")
    now = datetime(2026, 9, 11, tzinfo=timezone.utc)
    states = {"T9": TaskState()}
    memory = MemoryStore()
    scope = (principal.tenant, principal.user, "code_language")
    memory.put(scope, "Python", "U31", explicit_long_term=True)
    # 运费咨询不需要代码语言偏好：保存不等于每次都送入上下文。
    cache = Cache()

    def prepare(question: str) -> dict:
        state = states["T9"]
        items, strategy, versions = fixture(
            json.dumps(asdict(state), ensure_ascii=False), state.revision)
        return assemble(principal=principal, question=question, candidates=items,
                        strategy=strategy, expected_versions=versions, now=now,
                        input_budget=6000)

    first = prepare("A1042 签收十天后发现质量问题，退货运费谁承担？")
    print("第一轮选中来源：", first["sources"])
    print("第一轮排除原因：", [r for r in first["trace"] if r["reason"] != "selected"])
    # 只缓存教学请求内容；不缓存虚构的模型回答，更不代表已执行售后操作。
    key = Key(principal.tenant, principal.user, 1, "v2", 7,
              first["strategy_version"], "A1042运费")
    cache.put(key, json.dumps(first["payload"], ensure_ascii=False), now=0, ttl=60)

    old = states["T9"]
    updated = apply_pickup(old, "2026-09-13T09:00:00+08:00", "U19")
    save(states, updated, expected=old.revision)
    second = prepare("取件意向改成后天上午，仍然先不要提交。")
    compacted = snapshot(states["T9"], covered_through=19)
    print("第二轮请求：", json.dumps(second["payload"], ensure_ascii=False, indent=2))
    print("快照字段差异：", validate_summary(compacted, states["T9"]))
    new_key = Key(principal.tenant, principal.user, updated.revision, "v2", 7,
                  second["strategy_version"], "A1042运费")
    print("新状态是否命中旧缓存：", cache.get(new_key, now=10, currently_authorized=True))

    # 以下是失败路径的教学演示，不是测试套件，也没有实际执行。
    items, strategy, versions = fixture("仅咨询")
    try:
        assemble(principal=principal, question="运费？",
                 candidates=[i for i in items if i.item_id != "condition"],
                 strategy=strategy, expected_versions=versions, now=now, input_budget=6000)
    except AssemblyError as error:
        print("缺失政策条件：", str(error))
    try:
        assemble(principal=principal, question="运费？", candidates=items,
                 strategy=strategy, expected_versions=versions, now=now, input_budget=10)
    except AssemblyError as error:
        print("必需内容放不下：", str(error))


if __name__ == "__main__":
    main()
