from typing import Any, Awaitable, Callable, Dict

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

import config
import database as db


class MaintenanceMiddleware(BaseMiddleware):
    """
    Ta'mirlash rejimi yoqilganda, adminlardan boshqa hech kim botdan
    foydalana olmaydi (xabar forward qilinmaydi, tugmalar ishlamaydi).
    """

    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 and user.id not in config.ADMIN_IDS and db.is_maintenance():
            text = (
                "🛠 Bot hozirda texnik ishlar tufayli vaqtincha ishlamayapti.\n"
                "Iltimos, birozdan so'ng qayta urinib ko'ring."
            )
            if isinstance(event, Message):
                await event.answer(text)
            elif isinstance(event, CallbackQuery):
                await event.answer(text, show_alert=True)
            return
        return await handler(event, data)
