"""
Management of OpenStack Keystone Roles
======================================

.. versionadded:: 2018.3.0

:depends: shade
:configuration: see :py:mod:`salt.modules.keystoneng` for setup instructions

Example States

.. code-block:: yaml

    create role:
      keystone_role.present:
        - name: role1

    delete role:
      keystone_role.absent:
        - name: role1

    create role with optional params:
      keystone_role.present:
        - name: role1
        - description: 'my group'
"""


__virtualname__ = "keystone_role"


def __virtual__():
    if "keystoneng.role_get" in __salt__:
        return __virtualname__
    return (
        False,
        "The keystoneng execution module failed to load: shade python module is not"
        " available",
    )


def present(name, auth=None, **kwargs):
    """
    Ensure an role exists

    name
        Name of the role

    description
        An arbitrary description of the role
    """
    ret = {"name": name, "changes": {}, "result": True, "comment": ""}

    kwargs = __utils__["args.clean_kwargs"](**kwargs)

    __salt__["keystoneng.setup_clouds"](auth)

    kwargs["name"] = name
    role = __salt__["keystoneng.role_get"](**kwargs)

    if not role:
        if __opts__["test"] is True:
            ret["result"] = None
            ret["changes"] = kwargs
            ret["comment"] = "Role will be created."
            return ret

        role = __salt__["keystoneng.role_create"](**kwargs)
        ret["changes"]["id"] = role.id
        ret["changes"]["name"] = role.name
        ret["comment"] = "Created role"
        return ret
    # NOTE(SamYaple): Update support pending https://review.openstack.org/#/c/496992/
    return ret


def absent(name, auth=None, **kwargs):
    """
    Ensure role does not exist

    name
        Name of the role
    """
    ret = {"name": name, "changes": {}, "result": True, "comment": ""}

    __salt__["keystoneng.setup_clouds"](auth)

    kwargs["name"] = name
    role = __salt__["keystoneng.role_get"](**kwargs)

    if role:
        if __opts__["test"] is True:
            ret["result"] = None
            ret["changes"] = {"id": role.id}
            ret["comment"] = "Role will be deleted."
            return ret

        __salt__["keystoneng.role_delete"](name=role)
        ret["changes"]["id"] = role.id
        ret["comment"] = "Deleted role"

    return ret
