__VERSION__ = 5

# role categories
__SYS_PRIVATE_ROLE_CAT__ = '__SYS_PRIVATE_ROLE_CAT__'
__OWNER_PRIVATE_ROLE_CAT__ = '__OWNER_PRIVATE_ROLE_CAT__'
__SUPER_ADMIN_PRIVATE_ROLE_CAT__ = '__SUPER_ADMIN_PRIVATE_ROLE_CAT__'


# roles
__ROLE_OWNER__ = '__ROLE_OWNER__'
__ROLE_SUPER_ADMIN__ = '__ROLE_SUPER_ADMIN__'
__ROLE_ADMIN__ = '__ROLE_ADMIN__'



# permissions
__PERMISSION_TRANSFER_OWNERSHIP__ = '__PERMISSION_TRANSFER_OWNERSHIP__'
__PERMISSION_DELETE_INSTITUTE__ = '__PERMISSION_DELETE_INSTITUTE__'
__PERMISSION_EDIT_INSTITUTE__ = '__PERMISSION_EDIT_INSTITUTE__'
__PERMISSION_READ_INSTITUTE__ = '__PERMISSION_READ_INSTITUTE__'
__PERMISSION_MODIFY_OWNER_PRIVATE_ROLES__ = '__PERMISSION_MODIFY_OWNER_PRIVATE_ROLES__'
__PERMISSION_MODIFY_SUPER_ADMIN_ROLES__ = '__PERMISSION_MODIFY_SUPER_ADMIN_ROLES__'

__PERMISSION_READ_COLLABORATORS__ = '__PERMISSION_READ_COLLABORATORS__'


__PERMISSION_WRITE_APIKEY__ = '__PERMISSION_WRITE_APIKEY__'
__PERMISSION_READ_APIKEY__ = '__PERMISSION_READ_APIKEY__'

__PERMISSION_WRITE_QUESTIONBANK__ = '__PERMISSION_WRITE_QUESTIONBANK__'
__PERMISSION_READ_QUESTIONBANK__ = '__PERMISSION_READ_QUESTIONBANK__'

__PERMISSION_WRITE_QUESTION__ = '__PERMISSION_WRITE_QUESTION__'
__PERMISSION_READ_QUESTION__ = '__PERMISSION_READ_QUESTION__'

__PERMISSION_WRITE_TAG__ = '__PERMISSION_WRITE_TAG__'
__PERMISSION_READ_TAG__ = '__PERMISSION_READ_TAG__'

__PERMISSION_WRITE_EXAM_TEMPLATE__ = '__PERMISSION_WRITE_EXAM_TEMPLATE__'
__PERMISSION_READ_EXAM_TEMPLATE__ = '__PERMISSION_READ_EXAM_TEMPLATE__'

__PERMISSION_WRITE_EXAM__ = '__PERMISSION_WRITE_EXAM__'
__PERMISSION_READ_EXAM__ = '__PERMISSION_READ_EXAM__'

__PERMISSION_WRITE_EXAM_PAGE__ = '__PERMISSION_WRITE_EXAM_PAGE__'
__PERMISSION_READ_EXAM_PAGE__ = '__PERMISSION_READ_EXAM_PAGE__'

__PERMISSION_READ_INSTITUTE_BILLING__ = '__PERMISSION_READ_INSTITUTE_BILLING__'
# tree keys
_key_ = 'key'
_name_ = 'name'
_category_ = 'category'
_dedicated_permissions_ = 'dedicated_permissions'
_children_ = 'children'

# tree
ROLE_TREE = {
    _key_: __ROLE_OWNER__, _name_: 'Owner', _category_: __SYS_PRIVATE_ROLE_CAT__,
    _dedicated_permissions_: [__PERMISSION_TRANSFER_OWNERSHIP__, __PERMISSION_DELETE_INSTITUTE__, __PERMISSION_MODIFY_OWNER_PRIVATE_ROLES__, __PERMISSION_WRITE_APIKEY__],
    _children_: [
        {
            _key_: __ROLE_SUPER_ADMIN__, _name_: 'Admin', _category_: __OWNER_PRIVATE_ROLE_CAT__,
            _dedicated_permissions_: [__PERMISSION_READ_INSTITUTE_BILLING__, __PERMISSION_EDIT_INSTITUTE__, __PERMISSION_MODIFY_SUPER_ADMIN_ROLES__, __PERMISSION_READ_APIKEY__],
            _children_: [
                {
                    _key_: __ROLE_ADMIN__, _name_: 'Write', _category_: __SUPER_ADMIN_PRIVATE_ROLE_CAT__,
                    _dedicated_permissions_: [__PERMISSION_WRITE_QUESTIONBANK__, __PERMISSION_WRITE_QUESTION__, __PERMISSION_WRITE_TAG__, __PERMISSION_WRITE_EXAM__, __PERMISSION_WRITE_EXAM_TEMPLATE__, __PERMISSION_WRITE_EXAM_PAGE__,__PERMISSION_READ_INSTITUTE__, __PERMISSION_READ_COLLABORATORS__, __PERMISSION_READ_QUESTIONBANK__, __PERMISSION_READ_QUESTION__, __PERMISSION_READ_TAG__, __PERMISSION_READ_EXAM__, __PERMISSION_READ_EXAM_TEMPLATE__, __PERMISSION_READ_EXAM_PAGE__],
                    _children_: [
                       
                    ]
                }
            ]
        }
    ]
}


# finder utils
def role_permission_check(targetRoles, targetPermission, role_tree=ROLE_TREE, role_found=False):
    for targetRole in targetRoles:
        if role_tree[_key_] == targetRole:
            role_found = True

        if targetPermission in role_tree[_dedicated_permissions_] and role_found:
            return True

        for role in role_tree[_children_]:
            if role_permission_check([targetRole], targetPermission, role, role_found):
                return True

    return False


def role_cat_finder(targetRole, role_tree=ROLE_TREE, role_found=False):
    if role_tree[_key_] == targetRole:
        role_found = True

    if role_found:
        return role_tree[_category_]

    for role in role_tree[_children_]:
        cat = role_cat_finder(targetRole, role, role_found)
        if cat != None:
            return cat


def roles_permission_finder(my_roles, role_tree=ROLE_TREE):
    data = []
    for my_role in my_roles:
        if role_tree[_key_] == my_role:
            data.append(role_tree)
        else:
            for role in role_tree[_children_]:
                roles_permission_finder([my_role], role)
    return data
