"""
Memo Retrieval Tool - đọc ghi chú từ SQLite memos.db cho Agent.

Dùng để trả lời các câu hỏi kiểu:
- "Hôm nay tôi đã note gì?"
- "Tuần trước tôi note những gì về dự án X?"
"""

from __future__ import annotations

import json
import logging
from datetime import date
from typing import Optional

from langchain_core.tools import tool

from memos_core import db as memo_db


logger = logging.getLogger(__name__)


@tool
async def memo_retrieval_tool(
    date: str,
    tag: Optional[str] = None,
) -> str:
    """
    Truy vấn các memo đã note trong memos.db (SQLite).

    - Ưu tiên dùng để trả lời câu hỏi về lịch sử note, ví dụ:
      - "Hôm nay tôi đã note gì thế?"
      - "Ngày 2026-01-15 tôi note những gì?"
      - "Hôm nay tôi note gì về tag #work?"
    - Không làm semantic search phức tạp, chỉ lọc theo ngày và tag.
    """
    try:
        target_date = date or date_today_iso()
        logger.info("memo_retrieval_tool started, date=%s, tag=%s", target_date, tag)

        sql = """
            SELECT id, content, visibility, tags_json, created_at, updated_at
            FROM memos
            WHERE DATE(created_at) = ?
        """
        params: list[object] = [target_date]

        if tag:
            # Lọc đơn giản: tags_json là chuỗi JSON array, tìm substring theo tag.
            sql += " AND tags_json LIKE ?"
            params.append(f"%{tag}%")

        rows = await memo_db.fetch_all(sql, tuple(params))

        memos = []
        for row in rows:
            # Chuẩn hóa tags
            raw_tags = row.get("tags_json") or "[]"
            try:
                tags = json.loads(raw_tags)
                if not isinstance(tags, list):
                    tags = []
            except Exception:
                tags = []

            memos.append(
                {
                    "id": row.get("id"),
                    "content": row.get("content"),
                    "visibility": row.get("visibility"),
                    "tags": tags,
                    "created_at": row.get("created_at"),
                    "updated_at": row.get("updated_at"),
                }
            )

        return json.dumps(
            {
                "status": "success",
                "date": target_date,
                "tag": tag,
                "count": len(memos),
                "memos": memos,
            },
            ensure_ascii=False,
        )
    except Exception as exc:  # pragma: no cover
        logger.exception("memo_retrieval_tool error: %s", exc)
        return json.dumps(
            {
                "status": "error",
                "message": str(exc),
            },
            ensure_ascii=False,
        )


def date_today_iso() -> str:
    """Return today's date in YYYY-MM-DD format."""
    return date.today().isoformat()


