"""
bot/middlewares/db_middleware.py
-----------------------------------
این Middleware برای هر آپدیت یک Session دیتابیس می‌سازد
و آن را در اختیار Handler ها قرار می‌دهد (data["session"]).

همچنین کاربر جاری (بر اساس Telegram ID) را در data["db_user"]
قرار می‌دهد تا لازم نباشد در هر Handler دوباره Query بزنیم.

اگر کاربر مسدود شده باشد، آپدیت پردازش نمی‌شود.
"""

from __future__ import annotations

import logging
from typing import Any, Awaitable, Callable, Dict

from aiogram import BaseMiddleware
from aiogram.types import TelegramObject, User as TelegramUser

from database import crud
from database.database import get_session


logger = logging.getLogger(__name__)


class DatabaseMiddleware(BaseMiddleware):
    async def __call__(
        self,
        handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]],
        event: TelegramObject,
        data: Dict[str, Any],
    ) -> Any:
        async with get_session() as session:
            data["session"] = session

            tg_user: TelegramUser | None = data.get("event_from_user")

            if tg_user is not None:
                db_user = await crud.get_user_by_telegram_id(
                    session,
                    tg_user.id,
                )

                data["db_user"] = db_user

                if db_user is not None and db_user.is_blocked:
                    logger.info(
                        "Blocked user %s tried to use the bot.",
                        tg_user.id,
                    )
                    return None

            try:
                return await handler(event, data)

            except Exception:
                logger.exception(
                    "خطای مدیریت‌نشده در پردازش آپدیت"
                )

                # فعلاً خطا را دوباره بالا می‌فرستیم تا
                # traceback واقعی در کنسول مشخص شود.
                raise