import discord, asyncio, pymongo, os
from discord.ext import commands
from dotenv import load_dotenv
from discord.ui import Button, button, View

from dotenv import load_dotenv
load_dotenv()

def is_enabled(self):
        client = pymongo.MongoClient(os.getenv("mongo_url"))
        db = client.servers
        coll = db.settings

        if coll.find_one({"_id": {"guild_id": self.guild.id, "commands":"ticket"}}):
            command = coll.find_one({"_id": {"guild_id": self.guild.id, "commands":"ticket"}})
            command_enabled = command["enabled"] # True or False
            if command_enabled:
                return True
            else:
                return False
        else:
            return True

async def send_log(title: str, guild: discord.Guild, description: str, color: discord.Color):
    log_channel = discord.utils.get(guild.channels, name="ticket-logs")
    embed = discord.Embed(
        title=title,
        description=description,
        color=color
    )

    await log_channel.send(embed=embed)

class CreateButton(View):
    def __init__(self):
        super().__init__(timeout=None)

    @button(label="Create Ticket", style=discord.ButtonStyle.blurple, emoji="🎫", custom_id="ticketopen")
    async def ticket(self, interaction: discord.Interaction, button: Button):
        await interaction.response.defer(ephemeral=True)
        category: discord.CategoryChannel = discord.utils.get(interaction.guild.categories, name="OPENED TICKETS")
        for ch in category.text_channels:
            if ch.topic == f"{interaction.user.id} DO NOT CHANGE THE TOPIC OF THIS CHANNEL!":
                await interaction.followup.send("You already have a ticket open! Ticket located in {0}".format(ch.mention), ephemeral=True)
                return 
            
        # make a dictionary that increases by one everytime a ticket is created
        if not category:
            category = await interaction.guild.create_category_channel("OPENED TICKETS")
            counter = 0
        else:
            counter = len(category.text_channels)

            
            
        r1: discord.Role = discord.utils.get(interaction.guild.roles, name="Ticket Master")
        overwrites = {
            interaction.guild.default_role: discord.PermissionOverwrite(read_messages=False),
            r1: discord.PermissionOverwrite(read_messages=True, send_messages=True, manage_messages=True),
            interaction.user: discord.PermissionOverwrite(read_messages=True, send_messages=True),
            interaction.guild.me: discord.PermissionOverwrite(read_messages=True, send_messages=True)
        }
        channel = await category.create_text_channel(
            # the name of the channel should be ticket- and then a counter that increases everytime a ticket is opened
            name=f"{interaction.user}-{counter + 1}",
            topic=f"{interaction.user.id} DO NOT CHANGE THE TOPIC OF THIS CHANNEL!",
            overwrites=overwrites
        )

        em = discord.Embed(description="Someone will be here to assist you shortly.\nTo close this ticket react with 🔒",color=interaction.user.color)
        em.set_footer(text="Powered by Blob", icon_url=interaction.guild.me.avatar)

        await channel.send(f"{interaction.user.mention} Welcome to your ticket.\n\nPlease don't ping staff, they will be here soon.\n\n",embed=em, view=CloseButton())
        await interaction.followup.send(f"Ticket created in {channel.mention}", ephemeral=True)
        await send_log(
            title="Ticket Created",
            description=f"Created by: {interaction.user.mention}",
            color=discord.Color.green(),
            guild=interaction.guild
        )

class CloseButton(View):
    def __init__(self):
        super().__init__(timeout=None)

    @button(label="Close Ticket", style=discord.ButtonStyle.red, custom_id="closeticket", emoji="🔒")
    async def close(self, interaction: discord.Interaction, button: Button):
        await interaction.response.defer(ephemeral=True)
        await interaction.channel.send("Closing this ticket in 5 seconds")

        await asyncio.sleep(5)
        
        category: discord.CategoryChannel = discord.utils.get(interaction.guild.categories, name="CLOSED TICKETS")
        r1: discord.Role = discord.utils.get(interaction.guild.roles, name="Ticket Master")
        overwrites = {
            interaction.guild.default_role: discord.PermissionOverwrite(read_messages=False),
            r1: discord.PermissionOverwrite(read_messages=True, send_messages=True, manage_messages=True),
            interaction.guild.me: discord.PermissionOverwrite(read_messages=True, send_messages=True)
        }

        await interaction.channel.edit(category=category, overwrites=overwrites)
        await interaction.channel.send(
            embed = discord.Embed(
                title="Ticket Closed",
                description="This ticket has been closed\n\nTicket closed by {0}".format(interaction.user.mention),
                color=interaction.user.color
            ),
            view=TrashButton()
        )
        await send_log(
            title="Ticket Closed",
            description=f"Closed by: {interaction.user.mention}",
            color=discord.Color.yellow(),
            guild=interaction.guild
        )

class TrashButton(View):
    def __init__(self):
        super().__init__(timeout=None)

    @button(label="Trash Ticket", style=discord.ButtonStyle.red, custom_id="trash", emoji="🗑️")
    async def trash(self, interaction: discord.Interaction, button: Button):
        await interaction.response.defer(ephemeral=True)
        await interaction.channel.send("Deleting ticket in 3 seconds")
        await asyncio.sleep(3)

        await interaction.channel.delete()

        await send_log(
            title="Ticket Deleted",
            description=f"Deleted by: {interaction.user.mention}",
            color=discord.Color.red(),
            guild=interaction.guild
        )

class ticket(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    @commands.Cog.listener()
    async def on_ready(self):
        print('Tickets Online')

    @commands.hybrid_command(name="ticket", description="Create a ticket")
    @commands.has_permissions(administrator=True)
    @commands.check(is_enabled)
    async def ticket(self, ctx):
        if not discord.utils.get(ctx.guild.categories, name="OPENED TICKETS"):
            await ctx.guild.create_category(name="OPENED TICKETS")
        if not discord.utils.get(ctx.guild.categories, name="CLOSED TICKETS"):
            await ctx.guild.create_category(name="CLOSED TICKETS")
        if not discord.utils.get(ctx.guild.roles, name="Ticket Master"):
            await ctx.guild.create_role(name="Ticket Master")
        if not discord.utils.get(ctx.guild.channels, name="ticket-logs"):
            await ctx.guild.create_text_channel(name="ticket-logs")
        await ctx.send(
            embed=discord.Embed(
                description="Click the button below to create a ticket",
                color=ctx.author.color
            ),
            view=CreateButton()
        )

async def setup(bot):
    await bot.add_cog(ticket(bot))