from asyncio import create_task
from aiogram import Router, F
from aiogram.filters import Command
from aiogram.fsm.context import FSMContext
from aiogram.types import Message, CallbackQuery
from bot.core.bots import BotInfo, bot
from bot.filters import IsOwner
from bot.templates import msg
from bot.utils import status_clear
from bot.utils.auto_delete import auto_delete_message
from configs import COMMANDS

__all__ = ("router",)
CMD: str = "pin".lower()
router: Router = Router(name=f"{CMD}_cmd_router")


@router.message(Command(*COMMANDS[CMD], prefix=BotInfo.prefix, ignore_case=True), IsOwner())
async def pin_cmd(message: Message, state: FSMContext) -> None:
    """
    Обработчик команды /pin для закрепления последнего сообщения или ответа.
    """
    # Если есть reply → закрепляем его, иначе закрепляем предыдущее сообщение
    if message.reply_to_message:
        target_message_id = message.reply_to_message.message_id
    else:
        # Закрепляем предыдущее сообщение (команда - 1)
        target_message_id = message.message_id - 1

    try:
        await bot.pin_chat_message(
            chat_id=message.chat.id,
            message_id=target_message_id,
            disable_notification=False
        )

        # Автоудаление через 7 суток (удаляем закрепленное сообщение)
        create_task(
            auto_delete_message(
                chat_id=message.chat.id,
                message_id=target_message_id,
                delay=604800
            )
        )

        await msg(update=message, text="✅ Сообщение успешно закреплено", state=state)

    except Exception as e:
        await msg(update=message, text=f"❌ Ошибка закрепления: {e}", state=state)


@router.callback_query(F.data.casefold().isin(COMMANDS[CMD]), IsOwner())
async def pin_callback(callback: CallbackQuery, state: FSMContext) -> None:
    """
    Обработчик кнопки с callback_data="pin".
    """
    await status_clear(update=callback.message, state=state)

    try:
        await bot.pin_chat_message(
            chat_id=callback.message.chat.id,
            message_id=callback.message.message_id,
            disable_notification=False
        )

        create_task(
            auto_delete_message(
                chat_id=callback.message.chat.id,
                message_id=callback.message.message_id,
                delay=604800
            )
        )

        await callback.answer("✅ Сообщение закреплено")

    except Exception as e:
        await callback.answer(f"❌ Ошибка: {e}", show_alert=True)
