import discord
import utils.data as data
from discord.ext import commands
from discord.utils import get

ROLES_JSON = "roles"

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

    secret_roles = discord.SlashCommandGroup(
        "secretroles",
        checks=[commands.has_permissions(manage_roles=True)]
    )

    @secret_roles.command()
    async def add(self, ctx, role: discord.role.Role, password: str):
        roles = data.load_data(ROLES_JSON)
        if password in roles["secret_roles"]:
            return await ctx.respond(f"Password ``{password}`` is already used.", ephemeral=True)
 
        roles["secret_roles"][password] = role.id
        data.dump_data(ROLES_JSON, roles)
        return await ctx.respond(f"Secret role {role.mention} added with password {password}.", ephemeral=True)
    
    @secret_roles.command()
    async def list(self, ctx):
        roles = data.load_data(ROLES_JSON)
        if len(roles["secret_roles"]) == 0:
            return await ctx.respond(f"No current secret roles.", ephemeral=True)
        msg = ""
        for passwd, role in roles["secret_roles"].items():
            role = get(ctx.author.guild.roles, id=role)
            msg += f"``{passwd}``: {role.mention}\n"
        return await ctx.respond(msg, ephemeral=True)
    
    @secret_roles.command()
    async def delete(self, ctx, password: str):
        roles = data.load_data(ROLES_JSON)
        if password not in roles["secret_roles"]:
            return await ctx.respond(f"Role with passowrd {password} does not exist.", ephemeral=True)
 
        role = get(ctx.author.guild.roles, id=roles["secret_roles"][password])
        del roles["secret_roles"][password]
        data.dump_data(ROLES_JSON, roles)
        return await ctx.respond(
            f"Secret role {role.mention} no longer obtainable with password {password}.",
            ephemeral=True
        )


    @discord.slash_command()
    async def secretrole(self, ctx, password: str):
        roles = data.load_data(ROLES_JSON)
        if password in roles["secret_roles"]:
            author = ctx.author
            role = get(author.guild.roles, id=roles["secret_roles"][password])
            await author.add_roles(role, reason="Roles assigned for password knowledge.")
            return await ctx.respond(f"You now have role {role.mention}.", ephemeral=True)
        else:
            return await ctx.respond("Incorrect password.", ephemeral=True)

def setup(bot):
    bot.add_cog(Roles(bot))