from discord import User

from bashbot import bot


def has_permission(permission_name, user, channel):
    if permission_name is None:
        return True

    if isinstance(user, User):
        user = user.id

    if isinstance(user, str) and user.startswith("<@"):
        user = user[2:-1]

    if bot.settings.get("owner") == user:
        return True

    permission = bot.permissions.get(user)

    if permission:
        if "channels" in permission \
                and channel.id in permission["channels"] \
                and permission_name in permission["channels"][channel.id]:

            permission = permission["channels"][channel.id]

        elif "servers" in bot.permissions.get(user) and hasattr(channel, "server") \
                and channel.server.id in bot.permissions.get(user)["servers"] \
                and permission_name in bot.permissions.get(user)["servers"][channel.server.id]:

            permission = bot.permissions.get(user)["servers"][channel.server.id]

        elif "global" in bot.permissions.get(user) \
                and permission_name in bot.permissions.get(user)["global"]:

            permission = bot.permissions.get(user)["global"]

    if permission == bot.permissions.get(user):
        if not user.startswith("&") \
                and not channel.is_private \
                and has_roles_permission(permission_name, channel.server.get_member(user), channel):
            return True

        elif bot.permissions.get("default"):
            permission = bot.permissions.get("default")

    return permission_name in permission and permission[permission_name]


def has_roles_permission(permission_name, user, channel):
    for role in user.roles:
        if has_permission(permission_name, "&" + role.id, channel):
            return True

    return False


def set_permission(permission_name, new_value, user):
    if isinstance(user, User):
        user = user.id

    if isinstance(user, str) and user.startswith("<@"):
        user = user[2:-1]

    permissions = bot.permissions.get(user)

    if not permissions:
        bot.permissions.set(user, {})
        permissions = bot.permissions.get(user)

    parts = permission_name.split(".")

    if parts[0] in ["channels", "servers", "global"]:
        if parts[0] in permissions:
            permissions = permissions[parts[0]]
        else:
            permissions[parts[0]] = {}
            permissions = permissions[parts[0]]

        if parts[0] in ["channels", "servers"]:
            if parts[1].startswith("<#"):
                parts[1] = parts[1][2:-1]

            if parts[1] in permissions:
                permissions = permissions[parts[1]]
            else:
                permissions[parts[1]] = {}
                permissions = permissions[parts[1]]
            permission_name = ".".join(parts[2:])
        else:
            permission_name = ".".join(parts[1:])

    permissions[permission_name] = new_value.lower() == "true"
    bot.permissions.save()