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

from aiogram import BaseMiddleware
from aiogram.enums import ChatType
from aiogram.types import Message

from database import db

logger = logging.getLogger(__name__)


class MessageCounterMiddleware(BaseMiddleware):
    """
    Middleware для подсчёта сообщений в группах и супергруппах.
    """

    async def __call__(
            self,
            handler: Callable[[Message, Dict[str, Any]], Awaitable[Any]],
            event: Any,
            data: Dict[str, Any]
    ) -> Any:
        if not isinstance(event, Message):
            return await handler(event, data)

        # Проверяем, что сообщение пришло из группового чата и не от бота
        if (event.chat.type in (ChatType.GROUP, ChatType.SUPERGROUP) and
                not event.from_user.is_bot):
            try:
                await self.process_group_message(event)
            except Exception as e:
                logger.error(msg=f"Ошибка при обработке сообщения: {e}", exc_info=True)

        return await handler(event, data)

    @staticmethod
    async def process_group_message(message: Message) -> None:
        """
        Обработка сообщения из группового чата.
        """
        user_id: int = message.from_user.id
        message_text: str = message.text or message.caption or ""

        # Добавляем пользователя (если его ещё нет)
        await db.add_user(
            user_id=user_id,
            username=message.from_user.username,
            full_name=message.from_user.full_name,
        )

        # Сохраняем сообщение
        await db.add_message(
            user_id=user_id,
            message_text=message_text,
            created_at=message.date,
        )
