from decorators import help
import discord
from discord.ext import commands
from enums.help_categories import Category
from functions import checks
from functions.database import githubs, twitch


class SelfPromo(commands.Cog):

    def __init__(self, client):
        self.client = client
        self.utilsCog = self.client.get_cog("Utils")

    # Don't allow any commands to work when locked
    def cog_check(self, ctx):
        return not self.client.locked

    @commands.group(name="GitHub", aliases=["Git", "GitHubs", "Gh"], case_insensitive=True, usage="[@Persoon]*", invoke_without_command=True)
    @commands.check(checks.allowedChannels)
    @help.Category(category=Category.Other)
    async def github(self, ctx, member: discord.Member = None):
        # Get a specific member's GitHub
        if member:
            user_git = githubs.get_user(member.id)
            if not user_git:
                return await ctx.send("**{}** heeft zijn GitHub link nog niet doorgegeven.".format(member.display_name))

            return await self.createPersonalPromo(ctx, member, user_git[0][0], discord.Colour.from_rgb(250, 250, 250), "GitHub")

        l = githubs.getAll()
        await self.createPromoEmbed(ctx, l, discord.Colour.from_rgb(250, 250, 250), "GitHub", "files/images/github.png")

    @github.command(name="Add", aliases=["Insert", "Register", "Set"], usage="[Link]")
    async def githubadd(self, ctx, link):
        if "github.com" not in link.lower() and "github.ugent.be" not in link.lower() and "gitlab.com" not in link.lower():
            link = "https://github.com/{}".format(link)

        githubs.add(ctx.author.id, link)
        await ctx.message.add_reaction("✅")

    @commands.group(name="Twitch", aliases=["Streams"], case_insensitive=True, usage="[@Persoon]", invoke_without_command=True)
    @commands.check(checks.allowedChannels)
    @help.Category(category=Category.Other)
    async def twitch(self, ctx, member: discord.Member = None):
        # Get a specific member's GitHub
        if member:
            user_twitch = twitch.get_user(member.id)
            if not user_twitch:
                return await ctx.send("**{}** heeft zijn Twitch link nog niet doorgegeven.".format(member.display_name))

            return await self.createPersonalPromo(ctx, member, user_twitch[0][0], discord.Colour.from_rgb(100, 65, 165), "Twitch")

        l = twitch.getAll()
        await self.createPromoEmbed(ctx, l, discord.Colour.from_rgb(100, 65, 165), "Twitch", "files/images/twitch.png")

    @twitch.command(name="Add", aliases=["Insert", "Register", "Set"], usage="[Link]")
    async def twitchadd(self, ctx, link):
        if "twitch.tv" not in link.lower():
            link = "https://www.twitch.tv/{}".format(link)

        twitch.add(ctx.author.id, link)
        await ctx.message.add_reaction("✅")

    # Creates embed with everyone's links & a fancy image
    async def createPromoEmbed(self, ctx, users, colour, type, imageUrl=None):
        # Image file
        file = None

        # Sort users by Discord name
        users = [[self.utilsCog.getMember(ctx, user[0]), user[1]] for user in users if self.utilsCog.getMember(ctx, user[0]) is not None]
        users.sort(key=lambda x: x[0].name)

        embed = discord.Embed(colour=colour)
        if imageUrl is not None:
            # Link
            if "https" in imageUrl:
                embed.set_thumbnail(url=imageUrl)
            else:
                # Local file
                file = discord.File(imageUrl, filename="icon.png")
                embed.set_thumbnail(url="attachment://icon.png")
        embed.set_author(name="{} Links".format(type))
        for user in users:
            embed.add_field(name="{} ({})".format(
                user[0].display_name, user[0].name
            ), value=user[1], inline=False)
        embed.set_footer(text="Wil je je eigen {0} hierin? Gebruik {0} Add [Link] of stuur een DM naar DJ STIJN.".format(type))
        if file is not None:
            await ctx.send(embed=embed, file=file)
        else:
            await ctx.send(embed=embed)

    async def createPersonalPromo(self, ctx, user, link, colour, type):
        embed = discord.Embed(colour=colour)
        embed.set_author(name="{} Links".format(type), icon_url=user.avatar_url)
        embed.add_field(name="{} link van {}".format(type, user.display_name), value=link)
        await ctx.send(embed=embed)


def setup(client):
    client.add_cog(SelfPromo(client))
