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

class MaintenanceMiddleware(BaseMiddleware):
    async def __call__(self, handler, event: TelegramObject, data: dict):
        user = None
        if isinstance(event, Message):
            user = event.from_user
        elif isinstance(event, CallbackQuery):
            user = event.from_user
            
        if user:
            # بررسی مسدود بودن کاربر
            from database.database import AsyncSessionLocal
            from database.crud import get_user_by_telegram_id, get_setting
            
            async with AsyncSessionLocal() as session:
                user_db = await get_user_by_telegram_id(session, user.id)
                is_blocked = getattr(user_db, "is_blocked", False) if user_db else False
                
            if is_blocked:
                if isinstance(event, Message):
                    await event.answer("⚠️ <b>حساب کاربری شما مسدود شده است.</b>\nبرای پیگیری با پشتیبانی در ارتباط باشید.")
                elif isinstance(event, CallbackQuery):
                    await event.answer("⚠️ حساب کاربری شما مسدود شده است.", show_alert=True)
                return

            # اگر ادمین باشد، اجازه دسترسی دارد
            if user.id in config.admin_ids:
                return await handler(event, data)
                
            # بررسی وضعیت روشن/خاموش بودن ربات از دیتابیس
            async with AsyncSessionLocal() as session:
                bot_enabled = await get_setting(session, "bot_enabled", "true")
                
            if bot_enabled == "false":
                if isinstance(event, Message):
                    await event.answer("⚠️ <b>ربات در حال حاضر در دست تعمیر و به‌روزرسانی است.</b>\nلطفاً بعداً مراجعه کنید.")
                elif isinstance(event, CallbackQuery):
                    await event.answer("⚠️ ربات در حال تعمیر است و در دسترس نمی‌باشد.", show_alert=True)
                return
                
        return await handler(event, data)
