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

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

#include <cstddef>
#include <cstdint>
#include <mutex>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

#include <cm3p/cppdap/protocol.h>

#include "cmDebuggerSourceBreakpoint.h"

class cmListFileFunction;

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);
  size_t GetBreakpointCount() const;
  void ClearAll();
};

} // namespace cmDebugger
