"""
场景 3：时序知识工作者（Temporal Awareness）

演示双时间线和时间旅行功能：
1. 记住随时间变化的事实
2. 使用 update_memory 版本化更新
3. 创建快照（snapshot）
4. 对比不同时间点的差异（diff）
5. 追溯记忆来源（blame）
"""

from __future__ import annotations

import tempfile
import os
import time


def main():
    # ── 1. 初始化 ────────────────────────────────────────
    db_dir = tempfile.mkdtemp(prefix="temporal_")
    db_path = os.path.join(db_dir, "temporal.db")

    from agent_memory import AgentMemory

    memory = AgentMemory(
        db_path=db_path,
        enable_semantic=False,
        enable_filter=False,
        enable_dedup=False,
    )
    print(f"✅ AgentMemory 已初始化 (db={db_path})")

    # ── 2. 写入初始事实 ─────────────────────────────────
    print("\n" + "=" * 60)
    print("📝 阶段 1：写入初始事实")
    print("=" * 60)

    # 记住项目部署信息
    r1 = memory.remember(
        content="项目部署在 AWS us-east-1 区域，使用 EC2 + RDS",
        importance="high",
    )
    print(f"  ✅ 写入部署信息: {r1.get('status')}")
    mem_id_deploy = r1.get("memory_id", "")

    # 记住团队配置
    r2 = memory.remember(
        content="团队使用 Slack 通讯，频道 #project-alpha",
        importance="medium",
    )
    print(f"  ✅ 写入通讯工具: {r2.get('status')}")

    # 记住技术负责人
    r3 = memory.remember(
        content="技术负责人是张三，后端架构师",
        importance="high",
    )
    print(f"  ✅ 写入技术负责人: {r3.get('status')}")

    # ── 3. 创建第一个快照 ───────────────────────────────
    print("\n" + "=" * 60)
    print("📸 阶段 2：创建快照 v1")
    print("=" * 60)

    snapshot_v1 = memory.take_snapshot(
        label="v1_initial_state",
        description="项目初始状态：AWS us-east-1, Slack, 张三负责",
    )
    snapshot_v1_id = snapshot_v1.get("snapshot_id", "")
    print(f"  ✅ 快照已创建: {snapshot_v1.get('label', '')} (id={snapshot_v1_id[:16]}...)")

    # 等待一小段时间，确保时间戳不同
    time.sleep(1)

    # ── 4. 事实变更 — 版本化更新 ────────────────────────
    print("\n" + "=" * 60)
    print("🔄 阶段 3：事实变更（版本化更新）")
    print("=" * 60)

    # 部署区域从 AWS 迁移到阿里云
    if mem_id_deploy:
        update_result = memory.store.update_memory(
            memory_id=mem_id_deploy,
            new_content="项目部署在阿里云华东1区域，使用 ECS + RDS",
            change_reason="从 AWS 迁移到阿里云，降低国内延迟",
        )
        print(f"  ✅ 部署信息已更新:")
        print(f"     版本: v{update_result.get('version', '?')}")
        print(f"     旧内容: {update_result.get('old_content', '')[:40]}...")
        print(f"     新内容: {update_result.get('new_content', '')[:40]}...")

    # 技术负责人变更
    r3_mem_id = r3.get("memory_id", "")
    if r3_mem_id:
        update_result2 = memory.store.update_memory(
            memory_id=r3_mem_id,
            new_content="技术负责人是李四，全栈架构师",
            change_reason="张三离职，李四接任",
        )
        print(f"  ✅ 技术负责人已更新:")
        print(f"     版本: v{update_result2.get('version', '?')}")

    # 新增一条记忆
    memory.remember(
        content="通讯工具从 Slack 迁移到飞书，频道 project-alpha",
        importance="high",
    )
    print(f"  ✅ 新增通讯工具变更记录")

    # ── 5. 创建第二个快照 ───────────────────────────────
    print("\n" + "=" * 60)
    print("📸 阶段 4：创建快照 v2")
    print("=" * 60)

    snapshot_v2 = memory.take_snapshot(
        label="v2_after_migration",
        description="迁移后状态：阿里云, 飞书, 李四负责",
    )
    snapshot_v2_id = snapshot_v2.get("snapshot_id", "")
    print(f"  ✅ 快照已创建: {snapshot_v2.get('label', '')}")

    # ── 6. 查看版本历史 ─────────────────────────────────
    print("\n" + "=" * 60)
    print("📜 阶段 5：查看版本历史")
    print("=" * 60)

    if mem_id_deploy:
        versions = memory.store.get_memory_versions(mem_id_deploy)
        print(f"  部署信息版本数: {len(versions)}")
        for v in versions:
            is_current = " ← 当前" if v.get("is_current") else ""
            reason = v.get("change_reason", "initial")
            content_preview = v.get("content", "")[:50]
            print(f"    v{v.get('version_id', '?')}: {content_preview}... ({reason}){is_current}")

    # ── 7. 对比快照差异 ─────────────────────────────────
    print("\n" + "=" * 60)
    print("🔍 阶段 6：对比快照差异（时间旅行）")
    print("=" * 60)

    # 使用 snapshot ID 对比
    if snapshot_v1_id and snapshot_v2_id:
        diff = memory.diff_memories(
            from_snapshot=snapshot_v1_id,
            to_snapshot=snapshot_v2_id,
        )
        print(f"  差异统计:")
        print(f"    新增: {diff.get('added', 0)} 条")
        print(f"    修改: {diff.get('modified', 0)} 条")
        print(f"    删除: {diff.get('deleted', 0)} 条")

        # 详细差异
        for change in diff.get("changes", []):
            change_type = change.get("type", "?")
            content = change.get("content", "")[:50]
            print(f"    [{change_type}] {content}...")

    # 自然语言差异描述
    if snapshot_v1_id and snapshot_v2_id:
        natural_diff = memory.diff_natural(
            from_snapshot=snapshot_v1_id,
            to_snapshot=snapshot_v2_id,
        )
        print(f"\n  自然语言差异描述:")
        print(f"  {natural_diff[:200]}")

    # ── 8. 追溯记忆来源 ─────────────────────────────────
    print("\n" + "=" * 60)
    print("🔎 阶段 7：追溯记忆来源（Blame）")
    print("=" * 60)

    if mem_id_deploy:
        blame = memory.blame_memory(mem_id_deploy)
        print(f"  记忆 ID: {mem_id_deploy[:16]}...")
        print(f"  创建时间: {blame.get('created_at', 'unknown')}")
        print(f"  版本数: {blame.get('version_count', 0)}")

        # 自然语言来源描述
        blame_natural = memory.blame_natural(mem_id_deploy)
        print(f"  来源描述: {blame_natural[:150]}")

    # ── 9. 列出所有快照 ─────────────────────────────────
    print("\n" + "=" * 60)
    print("📋 阶段 8：快照列表")
    print("=" * 60)

    snapshots = memory.list_snapshots()
    print(f"  快照总数: {len(snapshots)}")
    for s in snapshots:
        label = s.get("label", "unnamed")
        desc = s.get("description", "")[:40]
        mem_count = s.get("memory_count", "?")
        print(f"    - {label}: {desc}... ({mem_count} 条记忆)")

    # ── 10. 时间线统计 ──────────────────────────────────
    print("\n" + "=" * 60)
    print("📊 阶段 9：时间线统计")
    print("=" * 60)

    stats = memory.get_timeline_stats()
    print(f"  快照数: {stats.get('snapshot_count', 0)}")
    print(f"  版本化记忆数: {stats.get('versioned_memory_count', 0)}")
    print(f"  总版本数: {stats.get('total_versions', 0)}")

    # ── 清理 ──────────────────────────────────────────────
    memory.close()
    print(f"\n✅ 示例完成！临时数据库保存在: {db_dir}")


if __name__ == "__main__":
    main()
