from typing import Callable, Dict, Any, Awaitable
from aiogram import BaseMiddleware
from aiogram.types import TelegramObject
from database import db

class DbMiddleware(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:
            existing_user = await db.get_user(user.id)
            is_new = (existing_user is None)
            
            await db.create_user(user.id, user.username, user.full_name)
            db_user = await db.get_user(user.id)
            
            # Check bot status (maintenance mode)
            bot_status = await db.get_setting("bot_status", "1")
            from config import ADMIN_IDS
            if bot_status == "0" and user.id not in ADMIN_IDS:
                from aiogram.types import Message, CallbackQuery
                maintenance_text = (
                    "⚠️ <b>ربات ایکس‌لنسر در حال حاضر در وضعیت تعمیرات و بروزرسانی می‌باشد.</b>\n\n"
                    "لطفاً دقایقی دیگر تلاش فرمایید. از شکیبایی شما سپاسگزاریم. 🛠"
                )
                if isinstance(event, Message):
                    await event.answer(maintenance_text, parse_mode="HTML")
                elif isinstance(event, CallbackQuery):
                    await event.answer("⚠️ ربات در وضعیت تعمیرات است.", show_alert=True)
                return # Intercept request
                
            # Check user ban status
            try:
                is_banned = db_user['is_banned']
            except (KeyError, IndexError, TypeError):
                is_banned = 0
                
            if db_user and is_banned:
                from aiogram.types import Message, CallbackQuery
                if isinstance(event, Message):
                    await event.answer("❌ حساب کاربری شما توسط مدیریت مسدود شده است.")
                elif isinstance(event, CallbackQuery):
                    await event.answer("❌ حساب کاربری شما مسدود است.", show_alert=True)
                return # Intercept request
                
            data["db_user"] = db_user
            data["is_new_user"] = is_new
        else:
            data["db_user"] = None
            data["is_new_user"] = False
        return await handler(event, data)
