from collections.abc import Awaitable, Callable
from typing import Any

from aiogram import BaseMiddleware
from aiogram.types import CallbackQuery, Message, TelegramObject

from config import ADMIN_ID


class AdminMiddleware(BaseMiddleware):
    """Middleware для проверки прав администратора.

    Добавляет в data['admin'] = True/False в зависимости от того,
    является ли пользователь администратором.
    """

    _admin_ids: set[int] = (
        set(ADMIN_ID) if isinstance(ADMIN_ID, list | tuple) else {ADMIN_ID}
    )

    async def __call__(
        self,
        handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[Any]],
        event: TelegramObject,
        data: dict[str, Any],
    ) -> Any:
        """Обрабатывает событие и добавляет флаг администратора в data."""
        data["admin"] = self._check_admin_access(event)
        return await handler(event, data)

    def _check_admin_access(self, event: TelegramObject) -> bool:
        """Проверяет, имеет ли пользователь права администратора."""
        try:
            if isinstance(event, Message):
                return event.from_user and event.from_user.id in self._admin_ids
            elif isinstance(event, CallbackQuery):
                return event.from_user and event.from_user.id in self._admin_ids

            user_id = getattr(getattr(event, "from_user", None), "id", None)
            return user_id in self._admin_ids if user_id else False
        except Exception:
            return False
