"""Whitelist: только ALLOWED_USER_IDS (+ ADMIN_USER_ID), если список задан."""

from __future__ import annotations

import logging
from typing import Any, Awaitable, Callable

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

from config import is_user_allowed

_log = logging.getLogger(__name__)

_DENY_TEXT = "⛔ Доступ закрыт. Обратитесь к администратору."


class AccessMiddleware(BaseMiddleware):
    async def __call__(
        self,
        handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[Any]],
        event: TelegramObject,
        data: dict[str, Any],
    ) -> Any:
        user = data.get("event_from_user")
        if user is None:
            return await handler(event, data)

        if is_user_allowed(user.id):
            return await handler(event, data)

        _log.info("Access denied user_id=%s", user.id)
        try:
            if isinstance(event, Message):
                await event.answer(_DENY_TEXT)
            elif isinstance(event, CallbackQuery):
                await event.answer(_DENY_TEXT, show_alert=True)
        except Exception:
            _log.debug("Failed to send access-denied notice to user_id=%s", user.id)
        return None
