from redbot.core import commands
from typing import Tuple


class CogOrCommand(commands.Converter):
    async def convert(self, ctx: commands.Context, arg: str) -> Tuple[str]:
        ret = ctx.bot.get_cog(arg)
        if ret:
            return "cogs", ret.__class__.__name__
        ret = ctx.bot.get_command(arg)
        if ret:
            return "commands", ret.qualified_name

        raise commands.BadArgument(
            'Cog or command "{arg}" not found. Please note that this is case sensitive.'
            "".format(arg=arg)
        )


class RuleType(commands.Converter):
    async def convert(self, ctx: commands.Context, arg: str) -> str:
        if arg.lower() in ("allow", "whitelist", "allowed"):
            return "allow"
        if arg.lower() in ("deny", "blacklist", "denied"):
            return "deny"

        raise commands.BadArgument(
            '"{arg}" is not a valid rule. Valid rules are "allow" or "deny"'.format(arg=arg)
        )
