//===-- MICmnLLDBDebugger.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 "lldb/API/SBDebugger.h"
#include "lldb/API/SBEvent.h"
#include "lldb/API/SBListener.h"
#include <condition_variable>
#include <map>
#include <mutex>

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

// Declarations:
class CMIDriverBase;
class CMICmnLLDBDebuggerHandleEvents;

//++
//============================================================================
// Details: MI proxy/adapter for the LLDB public SBDebugger API. The CMIDriver
//          requires *this object. Command classes make calls on *this object
//          to facilitate their work effort. The instance runs in its own worker
//          thread.
//          A singleton class.
//--
class CMICmnLLDBDebugger : public CMICmnBase,
                           public CMIUtilThreadActiveObjBase,
                           public MI::ISingleton<CMICmnLLDBDebugger> {
  friend class MI::ISingleton<CMICmnLLDBDebugger>;

  // Methods:
public:
  bool Initialize() override;
  bool Shutdown() override;

  bool SetDriver(const CMIDriverBase &vClientDriver);
  CMIDriverBase &GetDriver() const;
  lldb::SBDebugger &GetTheDebugger();
  lldb::SBListener &GetTheListener();
  void WaitForHandleEvent();
  bool CheckIfNeedToRebroadcastStopEvent();
  void RebroadcastStopEvent();

  // MI Commands can use these functions to listen for events they require
  bool RegisterForEvent(const CMIUtilString &vClientName,
                        const CMIUtilString &vBroadcasterClass,
                        const MIuint vEventMask);
  bool UnregisterForEvent(const CMIUtilString &vClientName,
                          const CMIUtilString &vBroadcasterClass);
  bool RegisterForEvent(const CMIUtilString &vClientName,
                        const lldb::SBBroadcaster &vBroadcaster,
                        const MIuint vEventMask);
  bool UnregisterForEvent(const CMIUtilString &vClientName,
                          const lldb::SBBroadcaster &vBroadcaster);

  // Overridden:
public:
  // From CMIUtilThreadActiveObjBase
  const CMIUtilString &ThreadGetName() const override;

  // Overridden:
protected:
  // From CMIUtilThreadActiveObjBase
  bool ThreadRun(bool &vrIsAlive) override;
  bool ThreadFinish() override;

  // Typedefs:
private:
  typedef std::map<CMIUtilString, MIuint> MapBroadcastClassNameToEventMask_t;
  typedef std::pair<CMIUtilString, MIuint>
      MapPairBroadcastClassNameToEventMask_t;
  typedef std::map<CMIUtilString, MIuint> MapIdToEventMask_t;
  typedef std::pair<CMIUtilString, MIuint> MapPairIdToEventMask_t;

  // Methods:
private:
  /* ctor */ CMICmnLLDBDebugger();
  /* ctor */ CMICmnLLDBDebugger(const CMICmnLLDBDebugger &);
  void operator=(const CMICmnLLDBDebugger &);

  bool InitSBDebugger();
  bool InitSBListener();
  bool InitStdStreams();
  bool MonitorSBListenerEvents(bool &vrbYesExit);

  bool BroadcasterGetMask(const CMIUtilString &vBroadcasterClass,
                          MIuint &vEventMask) const;
  bool BroadcasterRemoveMask(const CMIUtilString &vBroadcasterClass);
  bool BroadcasterSaveMask(const CMIUtilString &vBroadcasterClass,
                           const MIuint vEventMask);

  MIuint
  ClientGetMaskForAllClients(const CMIUtilString &vBroadcasterClass) const;
  bool ClientSaveMask(const CMIUtilString &vClientName,
                      const CMIUtilString &vBroadcasterClass,
                      const MIuint vEventMask);
  bool ClientRemoveTheirMask(const CMIUtilString &vClientName,
                             const CMIUtilString &vBroadcasterClass);
  bool ClientGetTheirMask(const CMIUtilString &vClientName,
                          const CMIUtilString &vBroadcasterClass,
                          MIuint &vwEventMask);
  bool LoadMIFormatters(lldb::SBTypeCategory miCategory);
  bool RegisterMISummaryProviders();
  // Overridden:
private:
  // From CMICmnBase
  /* dtor */ ~CMICmnLLDBDebugger() override;

  // Attributes:
private:
  CMIDriverBase
      *m_pClientDriver; // The driver that wants to use *this LLDB debugger
  lldb::SBDebugger m_lldbDebugger; // SBDebugger is the primordial object that
                                   // creates SBTargets and provides access to
                                   // them
  lldb::SBListener m_lldbListener; // API clients can register its own listener
                                   // to debugger events
  const CMIUtilString m_constStrThisThreadId;
  MapBroadcastClassNameToEventMask_t m_mapBroadcastClassNameToEventMask;
  MapIdToEventMask_t m_mapIdToEventMask;
  std::mutex m_mutexEventQueue;
  std::condition_variable m_conditionEventQueueEmpty;
  uint32_t m_nLastStopId;
};
