"""
Middleware для бота PrimoGuardBot.

Порядок выполнения middleware важен:
1. TimingMiddleware - замер времени выполнения
2. LoggingMiddleware - логирование всех событий
3. BanCheckMiddleware - проверка статуса бана (блокирует забаненных)
4. ErrorHandlingMiddleware - обработка ошибок (последний)

Message-level middleware:
1. RateLimitMiddleware/AntiSpamMiddleware - защита от флуда
2. SubscriptionMiddleware - проверка подписки на каналы
3. ReferralMiddleware - обработка реферальных ссылок
"""
from aiogram import Dispatcher, Bot

from configs import settings
from middleware.loggers import logger
from .error_mdw import ErrorHandlingMiddleware
from .logging_mdw import LoggingMiddleware
from .referal_mdw import ReferralMiddleware
from .spam_mdw import AntiSpamMiddleware, spam_stats
from .sub_mdw import SubscriptionMiddleware
from .time_mdw import TimingMiddleware
from .banwords_mdw import BanWordsMiddleware

__all__ = (
    # Middleware классы
    "TimingMiddleware",
    "LoggingMiddleware",
    "ErrorHandlingMiddleware",
    "AntiSpamMiddleware",
    "SubscriptionMiddleware",
    "ReferralMiddleware",
    "BanWordsMiddleware",

    # Статистика
    "spam_stats",

    # Утилиты
    "setup_middlewares",
)


def setup_middlewares(
        dp: Dispatcher,
        bot: Bot,
        admin_ids: list[int] = settings.ADMIN_ID+settings.OWNER_ID,
        channel_ids: list[int | str] | None = None,
        enable_spam_check: bool = False,
        enable_subscription_check: bool = False,
) -> dict:
    """
    Регистрирует все middleware в диспетчере.

    Args:
        dp: Диспетчер aiogram
        bot: Экземпляр бота
        admin_ids: ID администраторов (для защиты и уведомлений)
        channel_ids: ID каналов для проверки подписки
        enable_spam_check: Включить антиспам
        enable_subscription_check: Включить проверку подписки

    Returns:
        dict: Словарь с экземплярами middleware для доступа к методам
    """
    channel_ids = channel_ids or []

    # === UPDATE LEVEL MIDDLEWARE (для всех событий) ===
    middlewares_updates = []
    instances = {}

    # 1. Timing - замер времени (первый!)
    timing_mdw = TimingMiddleware()
    middlewares_updates.append(timing_mdw)
    instances['timing'] = timing_mdw

    # 2. Logging - логирование всех событий
    loggings_mdw = LoggingMiddleware()
    middlewares_updates.append(loggings_mdw)
    instances['logging'] = loggings_mdw

    # 3. ErrorHandling - обработка ошибок (последний!)
    errors_mdw = ErrorHandlingMiddleware(admin_ids=admin_ids)
    middlewares_updates.append(errors_mdw)
    instances['error'] = errors_mdw

    # === MESSAGE LEVEL MIDDLEWARE (только для сообщений) ===
    middlewares_msg = []

    # 1. AntiSpam - защита от флуда (опционально)
    if enable_spam_check:
        spams_mdw = AntiSpamMiddleware()
        middlewares_msg.append(spams_mdw)
        instances['spam'] = spams_mdw

    # 2. Subscription - проверка подписки на каналы (опционально)
    if enable_subscription_check and channel_ids:
        subs_mdw = SubscriptionMiddleware(bot=bot, channels=channel_ids)
        middlewares_msg.append(subs_mdw)
        instances['subscription'] = subs_mdw

    dp.message.middleware(BanWordsMiddleware())

    # 3. Referral - обработка реферальных ссылок
    referral_mdw = ReferralMiddleware()
    middlewares_msg.append(referral_mdw)
    instances['referral'] = referral_mdw

    # === РЕГИСТРАЦИЯ MIDDLEWARE ===

    # Регистрируем update-level middleware
    for middleware in middlewares_updates:
        dp.update.middleware(middleware)

    # Регистрируем message-level middleware
    for middleware in middlewares_msg:
        dp.message.middleware(middleware)

    # Логируем успешную регистрацию
    enabled_features = []
    if enable_spam_check:
        enabled_features.append("AntiSpam")
    if enable_subscription_check:
        enabled_features.append("Subscription")

    dp.channel_post.middleware(LoggingMiddleware())
    dp.edited_channel_post.middleware(LoggingMiddleware())

    logger.info(
        text=(
            f"Middleware зарегистрированы: "
            f"Update={len(middlewares_updates)}, "
            f"Message={len(middlewares_msg)}, "
            f"Функции=[{', '.join(enabled_features) if enabled_features else 'базовые'}]"
        ),
        log_type="MIDDLEWARE_SETUP"
    )

    return instances


