"""Логика согласования: показ карточки с черновиком, кнопки и их обработка."""
from __future__ import annotations

import bitrix
import store


def _keyboard(pending_id: str) -> list[dict]:
    """Кнопки клавиатуры бота. COMMAND_PARAMS несёт id заявки.

    Нажатие кнопки с COMMAND порождает событие ONIMCOMMANDADD."""
    return [
        {"TEXT": "✅ Отправить", "COMMAND": "approve", "COMMAND_PARAMS": pending_id,
         "BG_COLOR": "#1ba536", "TEXT_COLOR": "#ffffff", "DISPLAY": "LINE"},
        {"TEXT": "✏️ Поправить", "COMMAND": "edit", "COMMAND_PARAMS": pending_id,
         "DISPLAY": "LINE"},
        {"TEXT": "⏭️ Пропустить", "COMMAND": "skip", "COMMAND_PARAMS": pending_id,
         "DISPLAY": "LINE"},
    ]


async def present_draft(domain: str, operator_dialog: str, pending) -> None:
    """Шлёт оператору карточку с входящим и черновиком."""
    text = (
        f"[b]Новое сообщение[/b] (чат {pending.dialog_id})\n"
        f"[i]{pending.incoming}[/i]\n\n"
        f"[b]Черновик ответа:[/b]\n{pending.draft}\n\n"
        f"Отправить от твоего имени?"
    )
    await bitrix.bot_message(domain, operator_dialog, text, keyboard=_keyboard(pending.id))


async def handle_command(domain: str, command: str, params: str, operator_dialog: str) -> None:
    """Обработка нажатия кнопки (ONIMCOMMANDADD)."""
    pending_id = (params or "").strip()
    p = store.get_pending(pending_id)
    if not p or p.status != "new":
        await bitrix.bot_message(domain, operator_dialog, "Эта заявка уже обработана.")
        return

    if command == "approve":
        await bitrix.send_as_user(domain, p.dialog_id, p.draft)
        store.update_pending(pending_id, status="sent")
        await bitrix.bot_message(domain, operator_dialog, "✅ Отправлено.")

    elif command == "skip":
        store.update_pending(pending_id, status="skipped")
        await bitrix.bot_message(domain, operator_dialog, "⏭️ Пропущено, ничего не отправлено.")

    elif command == "edit":
        op = store.get_portal(domain)
        store.set_edit_state(domain, op["operator_id"], pending_id)
        await bitrix.bot_message(
            domain, operator_dialog,
            "✏️ Пришли исправленный текст одним сообщением — отправлю его вместо черновика.",
        )


async def handle_edit_text(domain: str, operator_dialog: str, pending_id: str, new_text: str) -> None:
    """Оператор прислал отредактированный текст — отправляем его."""
    p = store.get_pending(pending_id)
    if not p or p.status != "new":
        await bitrix.bot_message(domain, operator_dialog, "Заявка уже обработана.")
        return
    store.update_pending(pending_id, draft=new_text)
    await bitrix.send_as_user(domain, p.dialog_id, new_text)
    store.update_pending(pending_id, status="sent")
    await bitrix.bot_message(domain, operator_dialog, "✅ Отправлен исправленный ответ.")
