"""Small in-memory flood guard for administrator messages and buttons."""

from __future__ import annotations

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

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

WAIT_TEXT = "⏳ کمی صبر کنید و دوباره تلاش کنید."


class RateLimitMiddleware(BaseMiddleware):
    def __init__(self, interval_seconds: float = 0.8) -> None:
        self.interval = max(0.0, float(interval_seconds))
        self._last: dict[int, float] = {}

    async def __call__(
        self,
        handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[Any]],
        event: TelegramObject,
        data: dict[str, Any],
    ) -> Any:
        if self.interval <= 0:
            return await handler(event, data)
        user = getattr(event, "from_user", None)
        if user is None:
            return await handler(event, data)
        now = time.monotonic()
        previous = self._last.get(user.id)
        if previous is not None and now - previous < self.interval:
            if isinstance(event, CallbackQuery):
                await event.answer(WAIT_TEXT)
            elif isinstance(event, Message):
                await event.answer(WAIT_TEXT, parse_mode=None)
            return None
        if len(self._last) > 10_000:
            self._last.clear()
        self._last[user.id] = now
        return await handler(event, data)
