from discord.ext import commands, tasks
from discord import app_commands
import sqlite3
import discord

from global_variables import BOT_COLOR


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

    def cog_load(self):
        connection = sqlite3.connect("count.db")
        cursor = connection.cursor()
        cursor.execute(
            "CREATE TABLE IF NOT EXISTS count (command_name, count, PRIMARY KEY (command_name))"
        )
        connection.commit()
        connection.close()

        self.dump_count.start()

    @tasks.loop(seconds=30)
    async def dump_count(self):
        connection = sqlite3.connect("count.db")
        cursor = connection.cursor()

        for command_name, count in self.bot.temp_command_count.items():
            try:
                cursor.execute(
                    "INSERT INTO count (command_name, count) VALUES (?, ?)",
                    (command_name, count),
                )
            except sqlite3.IntegrityError:
                cursor.execute(
                    "UPDATE count SET count = count + ? WHERE command_name = ?",
                    (count, command_name),
                )

        connection.commit()
        connection.close()
        self.bot.temp_command_count = {}

    @commands.Cog.listener()
    async def on_app_command_completion(self, interaction, command):
        try:
            self.bot.temp_command_count[interaction.command.name] += 1
        except KeyError:
            self.bot.temp_command_count[interaction.command.name] = 1

    @commands.command()
    @commands.dm_only()
    @commands.is_owner()
    async def stats(self, ctx: commands.Context):
        connection = sqlite3.connect("count.db")
        cursor = connection.cursor()

        embed = discord.Embed(title="Command Statistics", color=BOT_COLOR)

        total = 0
        data = cursor.execute("SELECT * FROM count").fetchall()
        for entry in data:
            embed.add_field(name=entry[0], value=f"` {entry[1]} `", inline=True)
            total += entry[1]

        embed.add_field(name="TOTAL", value=f"` {total} `", inline=False)

        await ctx.send(embed=embed)


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