""" MacroCommand

  The MacroCommand class is a macro class for all the macro commands
  for interacting with multiple commands

"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from DIRAC import gLogger
from DIRAC.ResourceStatusSystem.Command.Command import Command

__RCSID__ = "$Id$"


class MacroCommand(Command):
    """
    As of today, it is not used.
    """

    def __init__(self):

        super(MacroCommand, self).__init__()

        self.commands = None
        self.args = None
        self.clients = None

    ################################################################################

    def setCommands(self, commandsListIn=None):
        """
        Method to be called as first at every MacroCommand instantiation.

        :params:

          :attr:`commandsListIn`: a list of command objects
        """
        if not isinstance(commandsListIn, list):
            commandsListIn = [commandsListIn]

        self.commands = commandsListIn

    ################################################################################

    def setArgs(self, argsListIn=None):
        """
        Set the arguments of the commands.

        :params:

          :attr:`argsListIn`: a list of args tuples, or just a tuple of args
        """
        if not isinstance(argsListIn, list):
            argsListIn = [argsListIn]

        self.args = argsListIn
        commArgs = []

        if len(self.args) == len(self.commands):
            commArgs = [(self.commands[x], self.args[x]) for x in range(len(self.commands))]
        elif len(self.args) == 1:
            commArgs = [(self.commands[x], self.args[0]) for x in range(len(self.commands))]
        else:
            gLogger.error("Tuples or `args` provided are nor 1 nor the same number of the commands")

        for command, arg in commArgs:
            command.setArgs(arg)

    ################################################################################

    def setClient(self, clientListIn=None):
        """
        Set `self.clients`. If not set, a standard client will be instantiated.
        Then, set the clients used by the commands.

        :params:
          :attr:`clientListIn`: a list of client object
        """
        if not isinstance(clientListIn, list):
            clientListIn = [clientListIn]

        self.clients = clientListIn
        commArgs = []

        if len(self.clients) == len(self.commands):
            commArgs = [(self.commands[x], self.clients[x]) for x in range(len(self.commands))]
        elif len(self.args) == 1:
            commArgs = [(self.commands[x], self.clients[0]) for x in range(len(self.commands))]
        else:
            gLogger.error("`clients` provided are nor 1 nor the same number of the commands")

        for command, client in commArgs:
            command.setClient(client)

    ################################################################################

    def doCommand(self):
        """
        Calls command.doCommand for every command in the list of self.commands
        """

        res = []

        for command in self.commands:
            res.append(command.doCommand())
        return res
