"""
Фильтры для проверки активных режимов бота (silence, conflict)
"""
from datetime import datetime
from typing import Optional

from aiogram.filters import BaseFilter
from aiogram.types import Message

from middleware.loggers import logger

__all__ = ('IsSilenceActive', 'IsConflictModeActive')


class IsSilenceActive(BaseFilter):
    """
    Проверяет, активен ли режим тишины (silence mode).

    В режиме тишины удаляются ВСЕ сообщения (кроме админов).

    Attributes:
        silence_until: Время до которого активен режим (None = неактивен)

    Example:
        ```python
        # В handler-файле
        silence_filter = IsSilenceActive()

        @router.message(silence_filter)
        async def silence_mode_active(message: Message):
            # Удаляем все сообщения в режиме тишины
            await message.delete()
        ```
    """

    def __init__(self, silence_until: Optional[datetime] = None):
        """
        Args:
            silence_until: Datetime до которого активен режим
        """
        self.silence_until = silence_until

    def update_silence_until(self, new_datetime: Optional[datetime]) -> None:
        """
        Обновляет время окончания режима тишины.

        Args:
            new_datetime: Новое время окончания или None для отключения
        """
        self.silence_until = new_datetime

        if new_datetime:
            logger.info(
                f"Режим тишины активирован до {new_datetime.strftime('%H:%M:%S')}",
                log_type='SILENCE'
            )
        else:
            logger.info("Режим тишины отключен", log_type='SILENCE')

    def is_active(self) -> bool:
        """
        Проверяет, активен ли режим сейчас.

        Returns:
            bool: True если режим активен
        """
        if self.silence_until is None:
            return False

        # Проверка истечения времени
        if datetime.now() >= self.silence_until:
            logger.info("Режим тишины автоматически завершен", log_type='SILENCE')
            self.silence_until = None
            return False

        return True

    async def __call__(self, event: Message) -> Optional[dict]:
        """
        Проверка активности режима тишины.

        Returns:
            dict или None: Информация о режиме если активен, иначе None
        """
        if self.is_active():
            remaining = (self.silence_until - datetime.now()).total_seconds()
            logger.debug(
                f"Режим тишины активен (осталось {remaining:.0f}с)",
                log_type='SILENCE',
                message=event
            )
            return {
                'is_active': True,
                'until': self.silence_until,
                'remaining_seconds': remaining
            }

        return None


class IsConflictModeActive(BaseFilter):
    """
    Проверяет, активен ли режим антиконфликта (conflict mode).

    В режиме антиконфликта удаляются сообщения с конфликтными словами.

    Attributes:
        conflict_until: Время до которого активен режим (None = неактивен)

    Example:
        ```python
        conflict_filter = IsConflictModeActive()

        @router.message(conflict_filter)
        async def conflict_mode_active(message: Message):
            # Проверяем на конфликтные слова и удаляем
            if has_conflict_words(message.text):
                await message.delete()
        ```
    """

    def __init__(self, conflict_until: Optional[datetime] = None):
        """
        Args:
            conflict_until: Datetime до которого активен режим
        """
        self.conflict_until = conflict_until

    def update_conflict_until(self, new_datetime: Optional[datetime]) -> None:
        """
        Обновляет время окончания режима антиконфликта.

        Args:
            new_datetime: Новое время окончания или None для отключения
        """
        self.conflict_until = new_datetime

        if new_datetime:
            logger.info(
                f"Режим антиконфликта активирован до {new_datetime.strftime('%H:%M:%S')}",
                log_type='CONFLICT'
            )
        else:
            logger.info("Режим антиконфликта отключен", log_type='CONFLICT')

    def is_active(self) -> bool:
        """
        Проверяет, активен ли режим сейчас.

        Returns:
            bool: True если режим активен
        """
        if self.conflict_until is None:
            return False

        # Проверка истечения времени
        if datetime.now() >= self.conflict_until:
            logger.info("Режим антиконфликта автоматически завершен", log_type='CONFLICT')
            self.conflict_until = None
            return False

        return True

    async def __call__(self, event: Message) -> Optional[dict]:
        """
        Проверка активности режима антиконфликта.

        Returns:
            dict или None: Информация о режиме если активен, иначе None
        """
        if self.is_active():
            remaining = (self.conflict_until - datetime.now()).total_seconds()
            logger.debug(
                f"Режим антиконфликта активен (осталось {remaining:.0f}с)",
                log_type='CONFLICT',
                message=event
            )
            return {
                'is_active': True,
                'until': self.conflict_until,
                'remaining_seconds': remaining
            }

        return None
