# -*- coding: utf-8 -*-
"""
记忆保存工具
Agent 通过此工具把对话中的关键信息保存为长期记忆，可跨会话检索。

构造函数接收 store（MemoryStore 实例），由 main.py 在初始化时注入。
store 为 None 时返回「记忆库未加载」错误，不抛异常。
"""
from typing import Any, Dict, List

from .base import Tool, coerce_list_of_str


class MemorySaveTool(Tool):
    """记忆保存工具：把一条记忆写入长期存储。

    依赖 MemoryStore（由 main.py 在 _HOST 创建后注入）。
    """

    def __init__(self, store=None):
        self._store = store

    @property
    def name(self) -> str:
        return "memory_save"

    @property
    def description(self) -> str:
        return (
            "保存一条长期记忆，可跨会话检索。"
            "参数：title（简短标题）、content（完整正文）、"
            "category（session/preference/fact，默认 session）、tags（可选标签列表）。"
        )

    @property
    def parameters(self) -> Dict[str, Any]:
        return {
            "type": "object",
            "properties": {
                "title": {
                    "type": "string",
                    "description": "记忆简短标题（建议 ≤ 50 字符）",
                },
                "content": {
                    "type": "string",
                    "description": "记忆完整正文",
                },
                "category": {
                    "type": "string",
                    "description": "记忆分类：session（会话摘要）/preference（用户偏好）/fact（客观事实）",
                    "default": "session",
                },
                "tags": {
                    "type": "array",
                    "items": {"type": "string"},
                    "description": "可选标签列表，便于分类检索",
                },
            },
            "required": ["title", "content"],
        }

    def execute(self, title: str, content: str, category: str = "session",
                tags: List[str] = None) -> Dict[str, Any]:
        """执行记忆保存，返回结果字典。"""
        if self._store is None:
            return {"success": False, "error": "记忆库未加载"}

        if not title or not title.strip():
            return {"success": False, "error": "title 不能为空"}
        if not content or not content.strip():
            return {"success": False, "error": "content 不能为空"}

        # 规整 category
        valid_categories = {"session", "preference", "fact"}
        if category not in valid_categories:
            category = "session"

        # 规整 tags
        normalized_tags = coerce_list_of_str(tags) if tags else []

        # 延迟导入避免循环依赖
        from ..memory import MemoryEntry
        entry = MemoryEntry(
            id="",  # 由 store.add 自动生成
            title=title.strip(),
            content=content.strip(),
            category=category,
            tags=normalized_tags,
        )
        self._store.add(entry)
        return {
            "success": True,
            "id": entry.id,
            "title": entry.title,
            "category": entry.category,
            "message": f"已保存记忆: {entry.title}",
        }
