"""Server-side administrator authorization for every admin update."""

from __future__ import annotations

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

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

from app.services.admin_service import AdminService

logger = logging.getLogger(__name__)


class AdminOnlyMiddleware(BaseMiddleware):
    """Check the database on every update, not just hide menu buttons."""

    def __init__(self, admins: AdminService) -> None:
        self.admins = admins

    async def __call__(
        self,
        handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[Any]],
        event: TelegramObject,
        data: dict[str, Any],
    ) -> Any:
        update = event if isinstance(event, Update) else None
        user = None
        if isinstance(event, (Message, CallbackQuery)):
            user = event.from_user
        elif update is not None:
            if update.message:
                user = update.message.from_user
            elif update.callback_query:
                user = update.callback_query.from_user
        if user is None or not await self.admins.is_admin(user.id):
            logger.warning("blocked unauthorized admin update from user %s", user.id if user else None)
            if isinstance(event, CallbackQuery):
                await event.answer("⛔️ دسترسی مدیریتی ندارید.", show_alert=True)
            elif isinstance(event, Message):
                await event.answer("⛔️ دسترسی مدیریتی ندارید.")
            return None
        return await handler(event, data)
