/* 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 <cstdint>
#include <mutex>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

#include <cm3p/cppdap/protocol.h>

class cmListFileFunction;

namespace cmDebugger {
class cmDebuggerSourceBreakpoint;
}

namespace dap {
class Session;
}

namespace cmDebugger {

struct cmDebuggerFunctionLocation
{
  int64_t StartLine;
  int64_t EndLine;
};

/** The breakpoint manager. */
class cmDebuggerBreakpointManager
{
  dap::Session* DapSession;
  std::mutex Mutex;
  std::unordered_map<std::string, std::vector<cmDebuggerSourceBreakpoint>>
    Breakpoints;
  std::unordered_map<std::string,
                     std::vector<struct cmDebuggerFunctionLocation>>
    ListFileFunctionLines;
  std::unordered_set<std::string> ListFilePendingValidations;
  int64_t NextBreakpointId = 0;

  dap::SetBreakpointsResponse HandleSetBreakpointsRequest(
    dap::SetBreakpointsRequest const& request);
  int64_t FindFunctionStartLine(std::string const& sourcePath, int64_t line);
  int64_t CalibrateBreakpointLine(std::string const& sourcePath, int64_t line);

public:
  cmDebuggerBreakpointManager(dap::Session* dapSession);
  void SourceFileLoaded(std::string const& sourcePath,
                        std::vector<cmListFileFunction> const& functions);
  std::vector<int64_t> GetBreakpoints(std::string const& sourcePath,
                                      int64_t line);
  void ClearAll();
};

} // namespace cmDebugger
