import time
from typing import Callable, Dict, Any, Awaitable
from aiogram import BaseMiddleware
from aiogram.types import Message, CallbackQuery, TelegramObject

class AntiFloodMiddleware(BaseMiddleware):
    def __init__(self, time_limit: float = 1.0):
        self.time_limit = time_limit
        self.user_timestamps = {}
        self.user_warned = {}

    async def __call__(
        self,
        handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]],
        event: TelegramObject,
        data: Dict[str, Any]
    ) -> Any:
        
        user_id = None
        
        if isinstance(event, Message):
            user_id = event.from_user.id
        elif isinstance(event, CallbackQuery):
            user_id = event.from_user.id
            
        if user_id:
            current_time = time.time()
            last_time = self.user_timestamps.get(user_id, 0)
            
            if current_time - last_time < self.time_limit:
                # User is flooding
                if not self.user_warned.get(user_id, False):
                    self.user_warned[user_id] = True
                    if isinstance(event, Message):
                        try:
                            await event.answer("⚠️ لطفاً آهسته‌تر پیام دهید. درخواست شما نادیده گرفته شد.")
                        except:
                            pass
                    elif isinstance(event, CallbackQuery):
                        try:
                            await event.answer("⚠️ لطفاً آهسته‌تر کلیک کنید.", show_alert=True)
                        except:
                            pass
                return  # Drop the update
            
            # Not flooding
            self.user_timestamps[user_id] = current_time
            self.user_warned[user_id] = False
            
        return await handler(event, data)
