/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
#pragma once

#include "cmConfigure.h" // IWYU pragma: keep

#include <cstddef>
#include <mutex>
#include <string>
#include <unordered_map>

#include <cm/optional>

#include <cm3p/cppdap/protocol.h>

#include "cmMessageType.h" // IWYU pragma: keep

namespace dap {
class Session;
struct CMakeInitializeResponse;
}

namespace cmDebugger {

struct cmDebuggerException
{
  std::string Id;
  std::string Description;
};

struct cmDebuggerExceptionFilter
{
  std::string Filter;
  std::string Label;
};

/** The exception manager. */
class cmDebuggerExceptionManager
{
  // Some older C++ standard libraries cannot hash an enum class by default.
  struct MessageTypeHash
  {
    std::size_t operator()(MessageType t) const
    {
      return std::hash<int>{}(static_cast<int>(t));
    }
  };

  dap::Session* DapSession;
  std::mutex Mutex;
  std::unordered_map<std::string, bool> RaiseExceptions;
  std::unordered_map<MessageType, cmDebuggerExceptionFilter, MessageTypeHash>
    ExceptionMap;
  cm::optional<cmDebuggerException> TheException;

  dap::SetExceptionBreakpointsResponse HandleSetExceptionBreakpointsRequest(
    dap::SetExceptionBreakpointsRequest const& request);

  dap::ExceptionInfoResponse HandleExceptionInfoRequest();

public:
  cmDebuggerExceptionManager(dap::Session* dapSession);
  void HandleInitializeRequest(dap::CMakeInitializeResponse& response);
  cm::optional<dap::StoppedEvent> RaiseExceptionIfAny(MessageType t,
                                                      std::string const& text);
  void ClearAll();
};

} // namespace cmDebugger
