"""
Manage ceph with salt.

.. versionadded:: 2016.11.0
"""

import logging

import salt.utils.json
from salt.exceptions import CommandExecutionError, CommandNotFoundError

log = logging.getLogger(__name__)


def _unchanged(name, msg):
    """
    Utility function: Return structure unchanged
    """
    return {"name": name, "result": True, "comment": msg, "changes": {}}


def _test(name, msg):
    """
    Utility function: Return structure test
    """
    return {"name": name, "result": None, "comment": msg, "changes": {}}


def _error(name, msg):
    """
    Utility function: Return structure error
    """
    return {"name": name, "result": False, "comment": msg, "changes": {}}


def _changed(name, msg, **changes):
    """
    Utility function: Return structure changed
    """
    return {"name": name, "result": True, "comment": msg, "changes": changes}


def _ordereddict2dict(input_ordered_dict):
    """
    Convert ordered dictionary to a dictionary
    """
    return salt.utils.json.loads(salt.utils.json.dumps(input_ordered_dict))


def quorum(name, **kwargs):
    """
    Quorum state

    This state checks the mon daemons are in quorum. It does not alter the
    cluster but can be used in formula as a dependency for many cluster
    operations.

    Example usage in sls file:

    .. code-block:: yaml

        quorum:
          sesceph.quorum:
            - require:
              - sesceph: mon_running
    """
    parameters = _ordereddict2dict(kwargs)
    if parameters is None:
        return _error(name, "Invalid parameters:%s")

    if __opts__["test"]:
        return _test(name, "cluster quorum")
    try:
        cluster_quorum = __salt__["ceph.cluster_quorum"](**parameters)
    except (CommandExecutionError, CommandNotFoundError) as err:
        return _error(name, err.strerror)
    if cluster_quorum:
        return _unchanged(name, "cluster is quorum")
    return _error(name, "cluster is not quorum")
