"""
场景 1：ChatBot with Memory（最简集成）

演示如何在对话循环中集成 Agent Memory：
1. 初始化 AgentMemory
2. 对话前 recall 相关上下文
3. 对话后 remember 对话内容
4. 使用 build_context 组装 prompt 上下文
5. 使用 feedback 优化检索质量
"""

from __future__ import annotations

import tempfile
import os
import sys


def main():
    # ── 1. 初始化 AgentMemory ──────────────────────────────
    # 使用 tempfile 创建临时数据库，退出后自动清理
    db_dir = tempfile.mkdtemp(prefix="chatbot_memory_")
    db_path = os.path.join(db_dir, "memory.db")

    from agent_memory import AgentMemory

    # enable_semantic=False: 跳过向量库，无需 sentence-transformers
    # enable_filter=False: 跳过 LLM 过滤，无需 LLM API
    # enable_dedup=False: 跳过去重，简化演示
    memory = AgentMemory(
        db_path=db_path,
        enable_semantic=False,
        enable_filter=False,
        enable_dedup=False,
    )
    print(f"✅ AgentMemory 已初始化 (db={db_path})")

    # ── 2. 模拟对话循环 ──────────────────────────────────
    conversations = [
        {"role": "user", "content": "我喜欢用 Python 写代码，尤其是 FastAPI 框架"},
        {"role": "assistant", "content": "好的，我记住了！FastAPI 是一个很棒的现代 Python Web 框架。"},
        {"role": "user", "content": "我目前在做一个 RAG 项目，用 Chroma 做向量库"},
        {"role": "assistant", "content": "Chroma 是一个轻量级的向量数据库，很适合 RAG 场景。"},
        {"role": "user", "content": "我偏好用 VSCode 作为开发工具"},
        {"role": "assistant", "content": "VSCode 是非常流行的编辑器，插件生态丰富。"},
    ]

    print("\n" + "=" * 60)
    print("📝 阶段 1：写入对话记忆")
    print("=" * 60)

    for turn in conversations:
        # 对话后记住内容
        result = memory.remember(
            content=f"[{turn['role']}] {turn['content']}",
            importance="high" if turn["role"] == "user" else "medium",
        )
        status = "✅" if result.get("written") else "⚠️"
        print(f"  {status} {turn['role']}: {turn['content'][:40]}... → {result.get('status', 'unknown')}")

    # ── 3. 在新对话中 recall 相关上下文 ──────────────────
    print("\n" + "=" * 60)
    print("🔍 阶段 2：检索相关记忆")
    print("=" * 60)

    # 用户问："我之前说了什么技术栈？"
    query = "技术栈"
    results = memory.recall(query=query, limit=5)

    print(f"\n  查询: 「{query}」")
    print(f"  检索模式: {results.get('search_mode', 'unknown')}")
    print(f"  结果数: {results.get('total', 0)}")

    for i, mem in enumerate(results.get("primary", []), 1):
        content = mem.get("content", "")[:60]
        importance = mem.get("importance", "medium")
        print(f"  {i}. [{importance}] {content}...")

    # ── 4. 使用 build_context 组装 prompt 上下文 ──────────
    print("\n" + "=" * 60)
    print("📋 阶段 3：组装 Prompt 上下文")
    print("=" * 60)

    context = memory.build_context(query="用户的技术偏好", max_tokens=300, style="compact")
    print(f"\n  上下文内容:\n{context}")

    # ── 5. 使用 feedback 优化质量 ────────────────────────
    print("\n" + "=" * 60)
    print("💡 阶段 4：反馈优化")
    print("=" * 60)

    # 标记第一条结果为有用
    if results.get("primary"):
        first_mem = results["primary"][0]
        mem_id = first_mem.get("memory_id", "")
        if mem_id:
            memory.feedback(mem_id, useful=True, note="关于技术栈的信息很有用")
            print(f"  ✅ 已标记记忆 {mem_id[:16]}... 为有用")

    # ── 6. 会话隔离演示 ─────────────────────────────────
    print("\n" + "=" * 60)
    print("🔒 阶段 5：会话隔离")
    print("=" * 60)

    # 创建另一个独立会话的 memory 实例
    db_path_2 = os.path.join(db_dir, "session2.db")
    memory_session2 = AgentMemory(
        db_path=db_path_2,
        enable_semantic=False,
        enable_filter=False,
        enable_dedup=False,
    )

    # 会话 2 写入不同内容
    memory_session2.remember("会话 2 的内容：讨论了产品设计方案", importance="medium")
    print("  会话 2 写入: 讨论了产品设计方案")

    # 会话 2 检索 — 不会看到会话 1 的内容（不同数据库）
    results_s2 = memory_session2.recall(query="技术栈", limit=5)
    print(f"  会话 2 检索「技术栈」: {results_s2.get('total', 0)} 条结果（隔离成功）")

    # 会话 1 检索 — 不会看到会话 2 的内容
    results_s1 = memory.recall(query="产品设计", limit=5)
    print(f"  会话 1 检索「产品设计」: {results_s1.get('total', 0)} 条结果（隔离成功）")

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


if __name__ == "__main__":
    main()
