"""
Фильтры для проверки типов чатов
"""
from typing import Union

from aiogram.filters import BaseFilter
from aiogram.types import Message, CallbackQuery
from aiogram.enums import ChatType

__all__ = ('IsPrivateChat', 'IsGroupChat', 'IsSuperGroupChat', 'IsChannelChat', 'IsAnyGroup')


class IsPrivateChat(BaseFilter):
    """
    Проверяет, что сообщение из личного чата (приватный диалог с ботом).

    Example:
        ```python
        @router.message(Command("start"), IsPrivateChat())
        async def start_private(message: Message):
            await message.answer("Привет в личке!")
        ```
    """

    async def __call__(self, event: Union[Message, CallbackQuery]) -> bool:
        if isinstance(event, CallbackQuery):
            event = event.message

        return event.chat.type == ChatType.PRIVATE


class IsGroupChat(BaseFilter):
    """
    Проверяет, что сообщение из обычной группы (не супергруппы).

    Example:
        ```python
        @router.message(IsGroupChat())
        async def group_message(message: Message):
            await message.answer("Это обычная группа")
        ```
    """

    async def __call__(self, event: Union[Message, CallbackQuery]) -> bool:
        if isinstance(event, CallbackQuery):
            event = event.message

        return event.chat.type == ChatType.GROUP


class IsSuperGroupChat(BaseFilter):
    """
    Проверяет, что сообщение из супергруппы.

    Example:
        ```python
        @router.message(IsSuperGroupChat())
        async def supergroup_message(message: Message):
            await message.answer("Это супергруппа")
        ```
    """

    async def __call__(self, event: Union[Message, CallbackQuery]) -> bool:
        if isinstance(event, CallbackQuery):
            event = event.message

        return event.chat.type == ChatType.SUPERGROUP


class IsChannelChat(BaseFilter):
    """
    Проверяет, что сообщение из канала.

    Example:
        ```python
        @router.message(IsChannelChat())
        async def channel_message(message: Message):
            await message.answer("Это канал")
        ```
    """

    async def __call__(self, event: Union[Message, CallbackQuery]) -> bool:
        if isinstance(event, CallbackQuery):
            event = event.message

        return event.chat.type == ChatType.CHANNEL


class IsAnyGroup(BaseFilter):
    """
    Проверяет, что сообщение из любой группы (обычная или супергруппа).

    Example:
        ```python
        @router.message(Command("admin"), IsAnyGroup())
        async def admin_command(message: Message):
            await message.answer("Команда доступна только в группах")
        ```
    """

    async def __call__(self, event: Union[Message, CallbackQuery]) -> bool:
        if isinstance(event, CallbackQuery):
            event = event.message

        return event.chat.type in (ChatType.GROUP, ChatType.SUPERGROUP)
