"""Smart search tools — search across tasks, messages, attachments."""

from cerebro_mcp.connection import execute
from cerebro_mcp.converters import task_to_dict
from cerebro_mcp.search import filter_tasks, search_messages, search_attachments, get_all_tasks_recursive


def register(mcp):

    @mcp.tool()
    async def search_tasks(
        project_id: str,
        name_contains: str | None = None,
        status_ids: list[str] | None = None,
        activity_ids: list[str] | None = None,
        allocated_user_id: str | None = None,
        recursive: bool = True,
        max_depth: int = 5,
    ) -> str:
        """Поиск задач в проекте по множеству критериев.
        project_id — ID корневого проекта для поиска.
        name_contains — подстрока в имени задачи (регистронезависимо).
        status_ids — фильтр по ID статусов (получите через get_statuses).
        activity_ids — фильтр по ID видов деятельности.
        allocated_user_id — только задачи назначенные на пользователя.
        recursive — искать рекурсивно по подзадачам.
        max_depth — максимальная глубина рекурсии."""
        try:
            pid = int(project_id)
            sid_list = [int(x) for x in status_ids] if status_ids else None
            aid_list = [int(x) for x in activity_ids] if activity_ids else None
            alloc_uid = int(allocated_user_id) if allocated_user_id else None
            results = await filter_tasks(
                parent_id=pid,
                status_ids=sid_list,
                activity_ids=aid_list,
                allocated_user_id=alloc_uid,
                name_contains=name_contains,
                recursive=recursive,
                max_depth=max_depth,
            )
            return str(results)
        except Exception as e:
            return f"Ошибка: {e}"

    @mcp.tool()
    async def search_messages_in_project(
        project_id: str,
        text_contains: str | None = None,
        message_types: list[int] | None = None,
        creator_name: str | None = None,
        has_video_attachment: bool | None = None,
        task_name_contains: str | None = None,
        limit: int = 50,
    ) -> str:
        """Поиск сообщений по всему проекту.
        project_id — ID проекта.
        text_contains — ключевое слово в тексте сообщения.
        message_types — фильтр по типу: 0=definition, 1=review, 2=report, 3=note, 4=client_review.
        creator_name — фильтр по имени автора (подстрока).
        has_video_attachment — только сообщения с видео-вложениями.
        task_name_contains — фильтр по имени задачи.
        limit — максимум результатов."""
        try:
            pid = int(project_id)
            # First get all tasks in project
            all_tasks = await get_all_tasks_recursive(pid, max_depth=5)

            # Filter by task name if needed
            if task_name_contains:
                tn_lower = task_name_contains.lower()
                all_tasks = [t for t in all_tasks if tn_lower in (t["name"] or "").lower()]

            task_ids = [int(t["id"]) for t in all_tasks]
            if not task_ids:
                return str([])

            results = await search_messages(
                task_ids=task_ids,
                text_contains=text_contains,
                message_types=message_types,
                creator_name=creator_name,
                has_attachments=True if has_video_attachment else None,
                attachment_is_video=has_video_attachment,
                limit=limit,
            )
            return str(results)
        except Exception as e:
            return f"Ошибка: {e}"

    @mcp.tool()
    async def search_attachments_in_project(
        project_id: str,
        filename_contains: str | None = None,
        is_video: bool | None = None,
        min_size: int | None = None,
        limit: int = 50,
    ) -> str:
        """Поиск вложений по всему проекту.
        project_id — ID проекта.
        filename_contains — подстрока в имени файла.
        is_video — только видео файлы.
        min_size — минимальный размер файла в байтах.
        limit — максимум результатов."""
        try:
            pid = int(project_id)
            all_tasks = await get_all_tasks_recursive(pid, max_depth=5)
            task_ids = [int(t["id"]) for t in all_tasks]
            if not task_ids:
                return str([])

            results = await search_attachments(
                task_ids=task_ids,
                filename_contains=filename_contains,
                is_video=is_video,
                min_size=min_size,
                limit=limit,
            )
            return str(results)
        except Exception as e:
            return f"Ошибка: {e}"
