""" General Message Queue Interface to create Consumers and Producers
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from DIRAC import gLogger, S_OK
from DIRAC.Resources.MessageQueue.MQProducer import MQProducer
from DIRAC.Resources.MessageQueue.MQConsumer import MQConsumer
from DIRAC.Resources.MessageQueue.MQConnectionManager import MQConnectionManager
from DIRAC.Resources.MessageQueue.Utilities import getMQParamsFromCS
from DIRAC.Resources.MessageQueue.Utilities import generateDefaultCallback

__RCSID__ = "$Id$"

connectionManager = MQConnectionManager()  # To manage the active MQ connections.


def createConsumer(mqURI, callback=generateDefaultCallback()):
    """
    Function creates MQConsumer. All parameters are taken from the
    Configuration Service based on the mqURI value.

    Args:
      mqURI(str):Pseudo URI identifing MQ service. It has the following format
                mqConnection::DestinationType::DestinationName
                e.g. blabla.cern.ch::Queues::MyQueue1
      callback: callback function that can be used to process the incoming messages

    Returns:
      S_OK/S_ERROR: with the consumer object in S_OK.

    """
    result = _setupConnection(mqURI=mqURI, mType="consumer")
    if not result["OK"]:
        return result
    return S_OK(MQConsumer(mqManager=connectionManager, mqURI=mqURI, consumerId=result["Value"], callback=callback))


def createProducer(mqURI):
    """
    Function creates MQProducer. All parameters are taken from
    the Configuration Service based on the mqURI value.

    Args:
      mqURI(str):Pseudo URI identifing MQ service. It has the following format
                mqConnection::DestinationType::DestinationName
                e.g. blabla.cern.ch::Queues::MyQueue1
    Returns:
      S_OK/S_ERROR: with the producer object in S_OK.
    """
    result = _setupConnection(mqURI=mqURI, mType="producer")
    if not result["OK"]:
        return result
    return S_OK(MQProducer(mqManager=connectionManager, mqURI=mqURI, producerId=result["Value"]))


def _setupConnection(mqURI, mType):
    """Function sets up the active MQ connection. All parameters are taken
        from the Configuration Service based on the mqURI
        value and the messenger Type mType.

    Args:
      mqURI(str):Pseudo URI identifing the MQ service. It has the following format:
                mqConnection::DestinationType::DestinationName
                e.g. blabla.cern.ch::Queues::MyQueue1
      mType(str): 'consumer' or 'producer'
    Returns:
      S_OK/S_ERROR: with the value of the messenger Id ( e.g. 'consumer4' ) in S_OK.
    """
    result = getMQParamsFromCS(mqURI=mqURI)
    if not result["OK"]:
        return result
    params = result["Value"]
    return connectionManager.startConnection(mqURI, params, mType)
