"""Messages: reports, reviews, notes, definitions."""

from cerebro_mcp.connection import execute
from cerebro_mcp.converters import message_to_dict


def register(mcp):

    @mcp.tool()
    async def get_task_messages(task_id: str) -> str:
        """Получить все сообщения задачи (постановки, отчёты, рецензии, заметки)."""
        try:
            tid = int(task_id)
            raw = await execute("task_messages", tid)
            messages = [message_to_dict(m) for m in (raw or [])]
            return str(messages)
        except Exception as e:
            return f"Ошибка: {e}"

    @mcp.tool()
    async def get_task_definition(task_id: str) -> str:
        """Получить постановку (definition) задачи. Возвращает message_id, нужный для add_report/add_review/add_note."""
        try:
            tid = int(task_id)
            raw = await execute("task_definition", tid)
            if not raw:
                return f"У задачи {task_id} нет постановки"
            return str(message_to_dict(raw))
        except Exception as e:
            return f"Ошибка: {e}"

    @mcp.tool()
    async def add_definition(task_id: str, text: str) -> str:
        """Создать постановку задачи. Текст в формате HTML или plain text. Возвращает message_id."""
        try:
            tid = int(task_id)
            msg_id = await execute("add_definition", tid, text)
            return str({"message_id": str(msg_id)})
        except Exception as e:
            return f"Ошибка: {e}"

    @mcp.tool()
    async def add_report(task_id: str, message_id: str, text: str, minutes: int) -> str:
        """Добавить отчёт к задаче с рабочим временем.
        message_id — ID постановки задачи, получите через get_task_definition().
        minutes — рабочее время в минутах (0 = не попадёт в статистику)."""
        try:
            tid = int(task_id)
            mid = int(message_id)
            msg_id = await execute("add_report", tid, mid, text, minutes)
            return str({"message_id": str(msg_id)})
        except Exception as e:
            return f"Ошибка: {e}"

    @mcp.tool()
    async def add_review(task_id: str, message_id: str, text: str, minutes: int = 0) -> str:
        """Добавить рецензию к задаче.
        message_id — ID постановки задачи, получите через get_task_definition()."""
        try:
            tid = int(task_id)
            mid = int(message_id)
            msg_id = await execute("add_review", tid, mid, text, minutes if minutes else None)
            return str({"message_id": str(msg_id)})
        except Exception as e:
            return f"Ошибка: {e}"

    @mcp.tool()
    async def add_note(task_id: str, message_id: str, text: str) -> str:
        """Добавить заметку к задаче.
        message_id — ID постановки задачи, получите через get_task_definition()."""
        try:
            tid = int(task_id)
            mid = int(message_id)
            msg_id = await execute("add_note", tid, mid, text)
            return str({"message_id": str(msg_id)})
        except Exception as e:
            return f"Ошибка: {e}"

    @mcp.tool()
    async def add_client_review(task_id: str, message_id: str, text: str) -> str:
        """Добавить клиентскую рецензию к задаче.
        message_id — ID постановки задачи, получите через get_task_definition()."""
        try:
            tid = int(task_id)
            mid = int(message_id)
            msg_id = await execute("add_client_review", tid, mid, text)
            return str({"message_id": str(msg_id)})
        except Exception as e:
            return f"Ошибка: {e}"
