# -*- coding: utf-8 -*-
"""
聊天记录查询工具模块

提供 Agent 直接查询 SQLite 聊天记录的能力，解决 Agent 用文件系统工具
找不到聊天记录的问题（聊天记录存在 SQLite，不在文件系统中）。

工具列表：
- search_chat_history: 按标题模糊搜索当前用户的会话
- get_session_chat:   获取指定会话的完整消息历史
"""

import json

from tools.vent_tools import _current_user, _current_session


async def search_chat_history(query: str, max_results: int = 5) -> str:
    """搜索当前用户的聊天历史记录（按会话标题匹配）。
    
    当用户询问"之前聊过什么""搜索历史记录""找一下关于xxx的对话"时调用。
    返回匹配的会话列表，包含标题、消息数量、会话 ID。
    
    如果需要查看某个会话的具体对话内容，再调用 get_session_chat。
    
    Args:
        query: 搜索关键词，匹配会话标题
        max_results: 最大返回条数，默认 5
    
    Returns:
        JSON 格式，包含 matching_sessions 列表。
        每条含 session_id、title、message_count、updated_at。
    """
    from db.chat_store import search_sessions as _db_search

    if not query or not query.strip():
        return json.dumps({"error": "搜索关键词不能为空"}, ensure_ascii=False)

    user_name = _current_user.get()
    try:
        sessions = _db_search(user_name, query.strip(), limit=max_results)
        results = [
            {
                "session_id": s["session_id"],
                "title": s.get("title", ""),
                "message_count": s.get("message_count", 0),
                "updated_at": s.get("updated_at", ""),
            }
            for s in sessions
        ]
        return json.dumps(
            {"query": query.strip(), "matching_sessions": results},
            ensure_ascii=False,
        )
    except Exception as e:
        return json.dumps({"error": f"搜索失败: {str(e)}"}, ensure_ascii=False)


async def get_session_chat(session_id: str, limit: int = 50) -> str:
    """获取指定会话的完整消息历史。
    
    当用户要求"查看那个会话的内容""把之前讨论的内容找出来""总结一下上次的对话"，
    且已知 session_id 时调用。通常先通过 search_chat_history 获取 session_id，
    再调用本工具读取具体内容。
    
    Args:
        session_id: 会话 ID（UUID 格式）
        limit: 最大返回消息条数，默认 50
    
    Returns:
        JSON 格式，包含 session_info（标题、创建时间等）和 messages 列表。
        每条消息含 role（user/assistant）、content、created_at。
    """
    from db.chat_store import get_messages as _db_msgs
    from db.chat_store import get_session_info as _db_info

    if not session_id or not session_id.strip():
        return json.dumps({"error": "会话 ID 不能为空"}, ensure_ascii=False)

    sid = session_id.strip()
    try:
        info = _db_info(sid)
        if not info:
            return json.dumps(
                {"error": f"会话不存在: {sid}", "session_id": sid},
                ensure_ascii=False,
            )

        msgs = _db_msgs(sid, limit=limit)
        messages = [
            {
                "role": m["role"],
                "content": m.get("content", ""),
                "created_at": m.get("created_at", ""),
            }
            for m in msgs
        ]

        return json.dumps(
            {
                "session_id": sid,
                "session_info": {
                    "title": info.get("title", ""),
                    "created_at": info.get("created_at", ""),
                    "updated_at": info.get("updated_at", ""),
                },
                "message_count": len(messages),
                "messages": messages,
            },
            ensure_ascii=False,
        )
    except Exception as e:
        return json.dumps(
            {"error": f"读取失败: {str(e)}", "session_id": sid},
            ensure_ascii=False,
        )


async def get_current_session_id() -> str:
    """获取当前本轮对话的数据库会话ID（session_id）。

    当需要知道当前正在进行的会话的唯一标识符时调用此工具。
    该 ID 可用于配合 get_session_chat 工具查看本轮会话的完整消息历史，
    或配合 search_chat_history 跨会话检索。

    无需任何参数，自动从请求上下文中获取。

    Returns:
        JSON 格式，包含当前会话的 session_id 和对应的 user_name。
    """
    user_name = _current_user.get()
    session_id = _current_session.get()
    if not session_id:
        return json.dumps({
            "error": "无法获取当前会话ID，可能不在对话上下文中",
            "session_id": "",
            "user_name": user_name,
        }, ensure_ascii=False)
    return json.dumps({
        "session_id": session_id,
        "user_name": user_name,
    }, ensure_ascii=False)
