"""Session / goal memory recall queries (0.2.2.50 + file location 0.2.2.51)."""

from __future__ import annotations

import re
from typing import Any

_MEMORY_QUERY_TOKENS = (
    "что ты помнишь",
    "что вы помните",
    "что мы делали",
    "что делали ранее",
    "что было раньше",
    "what do you remember",
    "what did we do",
    "previous session",
    "прошлый раз",
    "любимый цвет",
    "favorite color",
    "мой любимый",
    "my favorite",
    "что знаешь обо мне",
    "what do you know about me",
)
_RAM_CONTEXT_RE = re.compile(
    r"\b(?:оператив|ram|озу|свободн\w*\s+памят|memory\s+usage|memory\s+free)\b",
    re.IGNORECASE,
)
_COLOR_QUERY_RE = re.compile(
    r"\b(?:любим\w*\s+цвет|favorite\s+color|мой\s+цвет)\b",
    re.IGNORECASE,
)
_FILE_LOCATION_RE = re.compile(
    r"\b(?:"
    r"где\s+(?:размещ\w*|наход\w*|леж\w*|сохран\w*)\s+(?:документ|файл|досье)|"
    r"где\s+(?:документ|файл|досье)|"
    r"where\s+is\s+(?:the\s+)?(?:document|file|dossier)|"
    r"where\s+(?:is|did\s+you\s+save)\s+(?:the\s+)?(?:document|file)"
    r")\b",
    re.IGNORECASE,
)


def is_file_location_query(text: str) -> bool:
    """Ask where a recently written workspace file is located."""
    raw = str(text or "").strip()
    if not raw:
        return False
    return bool(_FILE_LOCATION_RE.search(raw))


def is_memory_query_intent(text: str) -> bool:
    """Recall stored session facts — not system RAM diagnostics."""
    raw = str(text or "").strip()
    if not raw:
        return False
    if is_file_location_query(raw):
        return True
    if _RAM_CONTEXT_RE.search(raw):
        return False
    lower = raw.lower()
    if any(token in lower for token in _MEMORY_QUERY_TOKENS):
        return True
    if _COLOR_QUERY_RE.search(raw) and "?" in raw:
        return True
    if re.search(r"\bчто\s+(?:ты|вы)\s+помн", lower):
        return True
    return False


def answer_file_location_query(text: str, *, memory: dict[str, Any] | None = None) -> str:
    """Answer from server goal memory first, then local goal memory."""
    try:
        from .orchestra_runtime_sync import query_server_goal_memory

        server = query_server_goal_memory(query=text)
        if isinstance(server, dict) and server.get("status") == "found":
            path = str(server.get("file_path") or "").strip()
            rel = str(server.get("relative_path") or "").strip()
            topic = str(server.get("topic") or "").strip()
            if path:
                lines = [f"Документ находится по пути: `{path}`"]
                if rel:
                    lines.append(f"Относительный путь: `{rel}`")
                if topic:
                    lines.append(f"Тема: {topic}")
                lines.append("(источник: Orchestra Goal Memory)")
                return "\n".join(lines)
    except Exception:
        pass

    from .goal_memory import GoalMemory, goal_memory_store

    mem = memory if isinstance(memory, dict) else goal_memory_store().snapshot().as_dict()
    gm = GoalMemory.from_dict(mem)
    rel = str(gm.last_written_file_relative or "").strip()
    abs_path = str(gm.last_written_file_path or "").strip()
    topic = str(gm.last_artifact_topic or gm.current_topic or "").strip()

    if rel or abs_path:
        if abs_path:
            display = abs_path
        elif rel.startswith("~/"):
            display = rel
        else:
            display = f"~/{rel}"
        topic_hint = f" ({topic})" if topic else ""
        return f"Последний записанный файл{topic_hint}: {display}"

    if topic:
        return (
            f"Файл по теме «{topic}» ещё не записан в этой сессии. "
            "Сначала выполните план создания документа."
        )
    return (
        "В сессионной памяти нет пути к последнему файлу. "
        "После write_file путь будет доступен здесь."
    )


def answer_memory_query(text: str, *, memory: dict[str, Any] | None = None) -> str:
    """Best-effort answer from desktop goal memory (not server chat history)."""
    if is_file_location_query(text):
        return answer_file_location_query(text, memory=memory)

    from .goal_memory import GoalMemory, goal_memory_store

    mem = memory if isinstance(memory, dict) else goal_memory_store().snapshot().as_dict()
    gm = GoalMemory.from_dict(mem)
    lower = str(text or "").strip().lower()

    if _COLOR_QUERY_RE.search(lower):
        return (
            "В сессионной памяти Desktop Agent нет сохранённого любимого цвета. "
            "Сообщите его явно — я запомню для текущей сессии."
        )

    parts: list[str] = []
    if gm.current_goal:
        parts.append(f"Текущая цель: {gm.current_goal}")
    if gm.current_topic:
        parts.append(f"Тема: {gm.current_topic}")
    if gm.last_artifact_topic and gm.last_artifact_topic != gm.current_topic:
        parts.append(f"Тема артефакта: {gm.last_artifact_topic}")
    if gm.last_written_file_relative or gm.last_written_file_path:
        path = gm.last_written_file_path or gm.last_written_file_relative
        parts.append(f"Последний файл: {path}")
    if gm.active_site or gm.current_target_site:
        parts.append(f"Активный сайт: {gm.active_site or gm.current_target_site}")
    if gm.last_created_folder:
        parts.append(f"Последняя папка: {gm.last_created_folder}")
    if gm.current_files:
        names = ", ".join(gm.current_files[:5])
        parts.append(f"Файлы из поиска: {names}")

    if parts:
        return "По памяти текущей сессии:\n" + "\n".join(f"• {line}" for line in parts)
    return (
        "В сессионной памяти Desktop Agent пока нет сохранённых фактов о прошлых шагах. "
        "После действий с сайтом, папкой или файлом контекст будет доступен здесь."
    )
