from discord import ButtonStyle, Embed, Interaction, ui
from redbot.core import commands
from redbot.core.utils.chat_formatting import bold

from tts.config import config


class Menu(ui.View):
    def __init__(self, ctx: commands.Context):
        super().__init__()
        self.ctx = ctx

    @ui.button(label="Announce", style=ButtonStyle.green, row=0)
    async def announce(self, interaction: Interaction, button: ui.Button):
        if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
            await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
            return
        await interaction.response.defer()
        current_setting = await config.guild(interaction.guild).announce
        await config.guild(interaction.guild).announce.set(not current_setting)
        await interaction.message.edit(embed=await embed(self.ctx))

    @ui.button(label="Use Voice Channels", style=ButtonStyle.green, row=0)
    async def voice_channels(self, interaction: Interaction, button: ui.Button):
        if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
            await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
            return
        await interaction.response.defer()
        current_setting = await config.guild(interaction.guild).voice_channels()
        await config.guild(interaction.guild).voice_channels.set(not current_setting)
        await interaction.message.edit(embed=await embed(self.ctx))

    @ui.select(placeholder="Enabled Channels", cls=ui.ChannelSelect, row=1)
    async def log_channel(self, interaction: Interaction, select: ui.ChannelSelect):
        if not interaction.user.guild_permissions.manage_guild and not interaction.user.guild_permissions.administrator:
            await interaction.response.send_message("You must have the manage guild permission to change this setting.", ephemeral=True)
            return
        await interaction.response.defer()
        channels: list = await config.guild(interaction.guild).enabled_channels()
        if select.values[0] in channels:
            channels.remove(select.values[0])
        else:
            channels.append(select.values[0])
        await config.guild(interaction.guild).enabled_channels.set(channels)
        await interaction.message.edit(embed=await embed(self.ctx))

async def embed(ctx: commands.Context):
    embed = Embed(title="TTS Settings", color=ctx.embed_color)
    override_settings = {
        "announce": await config.guild(ctx.guild).announce(),
        "voice_channels": await config.guild(ctx.guild).voice_channels(),
        "enabled_channels": await config.guild(ctx.guild).enabled_channels(),
    }

    override_str = [
        "- " + bold("Announce: ") + get_bool_emoji(override_settings["announce"]),
        "- " + bold("Voice Channels: ") + get_bool_emoji(override_settings["voice_channels"]),
        "- " + ", ".join([f"<#{channel}>" for channel in override_settings["voice_channels"]])
    ]
    embed.description = "\n".join(override_str)

def get_bool_emoji(value: bool) -> str:
    """Returns a unicode emoji based on a boolean value."""
    if value is True:
        return "\N{WHITE HEAVY CHECK MARK}"
    if value is False:
        return "\N{NO ENTRY SIGN}"
    return "\N{BLACK QUESTION MARK ORNAMENT}\N{VARIATION SELECTOR-16}"