//===-- MICmdInvoker.h ------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#pragma once

// Third party headers
#include <map>

// In-house headers:
#include "MICmdData.h"
#include "MICmdMgrSetCmdDeleteCallback.h"
#include "MICmnBase.h"
#include "MIUtilSingletonBase.h"

// Declarations:
class CMICmdBase;
class CMICmnStreamStdout;

//++
//============================================================================
// Details: MI Command Invoker. The Invoker works on the command pattern design.
//          There two main jobs; action command Execute() function, followed by
//          the command's Acknowledge() function. When a command has finished
//          its
//          execute function it returns to the invoker. The invoker then calls
//          the
//          command's Acknowledge() function to do more work, form and give
//          back a MI result. In the meantime the Command Monitor is monitoring
//          the each command doing their Execute() function work so they do not
//          exceed a time limit which if it exceeds informs the command(s) to
//          stop work.
//          The work by the Invoker is carried out in the main thread.
//          The Invoker takes ownership of any commands created which means it
//          is the only object to delete them when a command is finished
//          working.
//          A singleton class.
//--
class CMICmdInvoker : public CMICmnBase,
                      public CMICmdMgrSetCmdDeleteCallback::ICallback,
                      public MI::ISingleton<CMICmdInvoker> {
  friend class MI::ISingleton<CMICmdInvoker>;

  // Class:
public:
  //++
  // Description: Invoker's interface for commands to implement.
  //--
  class ICmd {
  public:
    virtual bool Acknowledge() = 0;
    virtual bool Execute() = 0;
    virtual bool ParseArgs() = 0;
    virtual void SetCmdData(const SMICmdData &vCmdData) = 0;
    virtual const SMICmdData &GetCmdData() const = 0;
    virtual const CMIUtilString &GetErrorDescription() const = 0;
    virtual void CmdFinishedTellInvoker() const = 0;
    virtual const CMIUtilString &GetMIResultRecord() const = 0;
    virtual const CMIUtilString &GetMIResultRecordExtra() const = 0;
    virtual bool HasMIResultRecordExtra() const = 0;

    /* dtor */ virtual ~ICmd() {}
  };

  // Methods:
public:
  bool Initialize() override;
  bool Shutdown() override;
  bool CmdExecute(CMICmdBase &vCmd);
  bool CmdExecuteFinished(CMICmdBase &vCmd);

  // Typedefs:
private:
  typedef std::map<MIuint, CMICmdBase *> MapCmdIdToCmd_t;
  typedef std::pair<MIuint, CMICmdBase *> MapPairCmdIdToCmd_t;

  // Methods:
private:
  /* ctor */ CMICmdInvoker();
  /* ctor */ CMICmdInvoker(const CMICmdInvoker &);
  void operator=(const CMICmdInvoker &);
  void CmdDeleteAll();
  bool CmdDelete(const MIuint vCmdId, const bool vbYesDeleteCmd = false);
  bool CmdAdd(const CMICmdBase &vCmd);
  bool CmdStdout(const SMICmdData &vCmdData) const;
  void CmdCauseAppExit(const CMICmdBase &vCmd) const;

  // Overridden:
private:
  // From CMICmnBase
  /* dtor */ ~CMICmdInvoker() override;
  // From CMICmdMgrSetCmdDeleteCallback::ICallback
  void Delete(SMICmdData &vCmd) override;

  // Attributes:
private:
  MapCmdIdToCmd_t m_mapCmdIdToCmd;
  CMICmnStreamStdout &m_rStreamOut;
};
