from typing import Union

from aiogram.types import (
    FSInputFile,
    CallbackQuery,
    Message,
    ReplyKeyboardMarkup,
    InlineKeyboardMarkup
)
from aiogram.utils.keyboard import ReplyKeyboardBuilder, InlineKeyboardBuilder

# Настройка экспорта в модули
__all__ = ('msg', 'msg_photo', 'markups',)


def markups(markup: Union[
    InlineKeyboardBuilder,
    ReplyKeyboardBuilder,
    InlineKeyboardMarkup,
    ReplyKeyboardMarkup,
    None] = None, ) -> None:
    """Получение маркапа"""
    reply_markup: Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, None] = None

    if markup:
        if isinstance(markup, InlineKeyboardBuilder):
            reply_markup = markup.as_markup()
        elif isinstance(markup, ReplyKeyboardBuilder):
            reply_markup = markup.as_markup(resize_keyboard=True)
        elif isinstance(markup, (InlineKeyboardMarkup, ReplyKeyboardMarkup)):
            reply_markup = markup
    return reply_markup


async def msg(
        message: Message | CallbackQuery,
        text: str = "Сообщение отправлено!",
        markup: Union[
            InlineKeyboardBuilder,
            ReplyKeyboardBuilder,
            InlineKeyboardMarkup,
            ReplyKeyboardMarkup,
            None,
        ] = None,
) -> None:
    """
    Шаблон для отправки текстового сообщения или ответа на callback-запрос.

    Args:
        message (Message | CallbackQuery): Сообщение или callback-запрос.
        text (str): Текст сообщения.
        markup (Union[InlineKeyboardBuilder, ReplyKeyboardBuilder, InlineKeyboardMarkup, ReplyKeyboardMarkup, None]):
            Клавиатура для сообщения. Может быть билдера или готовый объект.
    """

    if isinstance(message, Message):
        await message.reply(text=text, reply_markup=markups(markup))
    else:
        await message.message.reply(text=text, reply_markup=markups(markup))


async def msg_photo(
        message: Message | CallbackQuery,
        file: str = "assets/default.jpg",
        text: str = "Сообщение отправлено!",
        markup: Union[
            InlineKeyboardBuilder,
            ReplyKeyboardBuilder,
            InlineKeyboardMarkup,
            ReplyKeyboardMarkup,
            None,
        ] = None,
) -> None:
    """
    Шаблон для отправки фотографии с подписью или ответа на callback-запрос.

    Args:
        message (Message | CallbackQuery): Сообщение или callback-запрос.
        file (str): Путь к файлу фотографии.
        text (str): Подпись к фото.
        markup (Union[InlineKeyboardBuilder, ReplyKeyboardBuilder, InlineKeyboardMarkup, ReplyKeyboardMarkup, None]):
            Клавиатура для сообщения. Может быть билдера или готовый объект.
    """

    if isinstance(message, Message):
        await message.reply_photo(photo=FSInputFile(file), caption=text, reply_markup=markups(markup))
    else:
        await message.message.reply_photo(photo=FSInputFile(file), caption=text, reply_markup=markups(markup))
