import discord
from discord.ext import commands
from discord import app_commands
from discord.ext.commands.errors import *
import datetime

from global_variables import BOT_COLOR, CheckPlayerError
from custom_source import LoadError


class slash_handlers(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
        bot.tree.on_error = self.on_error

    async def on_error(self, interaction: discord.Interaction, error):
        music_commands = [
            "play",
            "clear",
            "np",
            "pause",
            "queue",
            "remove",
            "resume",
            "shuffle",
            "skip",
            "stop",
        ]

        if isinstance(error, CommandNotFound):
            return

        # elif isinstance(error, app_commands.MissingPermissions):
        #     embed = discord.Embed(
        #         title="Missing Permissions!",
        #         description=f"{error}",
        #         color=BOT_COLOR
        #     )
        #     await interaction.response.send_message(embed=embed, ephemeral=True)

        # elif isinstance(error, app_commands.BotMissingPermissions):
        #     embed = discord.Embed(
        #         title="Bot Missing Permissions!",
        #         description=f"{error}",
        #         color=BOT_COLOR
        #     )
        #     await interaction.response.send_message(embed=embed, ephemeral=True)

        elif isinstance(error, CheckPlayerError):
            embed = discord.Embed(
                title=error.info["title"],
                description=error.info["description"],
                color=BOT_COLOR,
            )
            embed.set_footer(
                text=datetime.datetime.now(datetime.timezone.utc).strftime(
                    "%Y-%m-%d %H:%M:%S"
                )
                + " UTC"
            )
            await interaction.response.send_message(embed=embed, ephemeral=True)

        elif (
            isinstance(error, app_commands.CheckFailure)
            and interaction.command.name in music_commands
        ):
            embed = discord.Embed(
                title="Player Creation Error",
                description="An error occured when creating a player. Please try again.",
                color=BOT_COLOR,
            )
            embed.set_footer(
                text=datetime.datetime.now(datetime.timezone.utc).strftime(
                    "%Y-%m-%d %H:%M:%S"
                )
                + " UTC"
            )
            await interaction.response.send_message(embed=embed, ephemeral=True)

        elif isinstance(error, LoadError):
            embed = discord.Embed(
                title="Nothing Found",
                description="Spotify does not allow direct play, meaning songs have to be found on a supported provider. In this case, the song couldn't be found. Please try again with a different song, or try searching for just the name and artist manually rather than sending a link.",
                color=BOT_COLOR,
            )
            embed.set_footer(
                text=datetime.datetime.now(datetime.timezone.utc).strftime(
                    "%Y-%m-%d %H:%M:%S"
                )
                + " UTC"
            )
            await interaction.response.send_message(embed=embed, ephemeral=True)

        else:
            raise error

    @commands.Cog.listener()
    async def on_command_error(self, ctx, error):
        return


async def setup(bot: commands.Bot):
    await bot.add_cog(slash_handlers(bot))