import asyncio
from typing import List, Callable, Awaitable

from discord import Message, Embed, Emoji
from discord.ext.commands import Context


async def make_tabbed_message(ctx: Context, message: Message, emoji_ids: List[int], embeds: List[Embed], timeout=300):
    emoji_ids = list(emoji_ids)

    async def callback(emoji_id, _ctx, _message):
        await message.edit(embed=embeds[emoji_ids.index(emoji_id)])

    await make_reaction_message(ctx, message, emoji_ids, callback, timeout)


async def make_reaction_message(ctx: Context, message: Message, emoji_ids: List[int],
                                callback: Callable[[int, Context, Message], Awaitable[None]], timeout=300):
    for emoji_id in emoji_ids:
        await message.add_reaction(ctx.bot.get_emoji(emoji_id))

    def check(rxn, usr):
        return usr == ctx.author and rxn.emoji.id in emoji_ids and rxn.message.id == message.id

    while True:
        try:
            reaction, user = await ctx.bot.wait_for('reaction_add', timeout=timeout, check=check)
            await callback(reaction.emoji.id, ctx, message)
            await message.remove_reaction(reaction, user)
        except asyncio.TimeoutError:
            for emoji_id in emoji_ids:
                await message.remove_reaction(ctx.bot.get_emoji(emoji_id), ctx.bot.user)
            break