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

#include "cmDebuggerThreadManager.h"

#include <algorithm>

#include <cm/optional>

#include <cm3p/cppdap/optional.h>
#include <cm3p/cppdap/protocol.h>
#include <cm3p/cppdap/types.h>

#include "cmDebuggerThread.h"

namespace cmDebugger {

std::atomic<int64_t> cmDebuggerThreadManager::NextThreadId(1);

std::shared_ptr<cmDebuggerThread> cmDebuggerThreadManager::StartThread(
  std::string const& name)
{
  std::shared_ptr<cmDebuggerThread> thread =
    std::make_shared<cmDebuggerThread>(
      cmDebuggerThreadManager::NextThreadId.fetch_add(1), name);
  Threads.emplace_back(thread);
  return thread;
}

void cmDebuggerThreadManager::EndThread(
  std::shared_ptr<cmDebuggerThread> const& thread)
{
  Threads.remove(thread);
}

cm::optional<dap::StackTraceResponse>
cmDebuggerThreadManager::GetThreadStackTraceResponse(
  dap::StackTraceRequest const& request)
{
  auto it = find_if(Threads.begin(), Threads.end(),
                    [&](std::shared_ptr<cmDebuggerThread> const& t) {
                      return t->GetId() == request.threadId;
                    });

  if (it == Threads.end()) {
    return {};
  }

  return GetStackTraceResponse(*it, request.format);
}

} // namespace cmDebugger
