//===-- SBProgress.cpp --------------------------------------------------*-===//
//
// 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
//
//===----------------------------------------------------------------------===//

#include "lldb/API/SBProgress.h"
#include "lldb/Core/Progress.h"
#include "lldb/Utility/Instrumentation.h"

using namespace lldb;

SBProgress::SBProgress(const char *title, const char *details,
                       SBDebugger &debugger) {
  LLDB_INSTRUMENT_VA(this, title, details, debugger);

  m_opaque_up = std::make_unique<lldb_private::Progress>(
      llvm::StringRef(title).str(), llvm::StringRef(details).str(),
      /*total=*/std::nullopt, debugger.get(),
      /*minimum_report_time=*/std::nullopt,
      lldb_private::Progress::Origin::eExternal);
}

SBProgress::SBProgress(const char *title, const char *details,
                       uint64_t total_units, SBDebugger &debugger) {
  LLDB_INSTRUMENT_VA(this, title, details, total_units, debugger);

  m_opaque_up = std::make_unique<lldb_private::Progress>(
      llvm::StringRef(title).str(), llvm::StringRef(details).str(), total_units,
      debugger.get(),
      /*minimum_report_time=*/std::nullopt,
      lldb_private::Progress::Origin::eExternal);
}

SBProgress::SBProgress(SBProgress &&rhs)
    : m_opaque_up(std::move(rhs.m_opaque_up)) {}

SBProgress::~SBProgress() = default;

void SBProgress::Increment(uint64_t amount, const char *description) {
  LLDB_INSTRUMENT_VA(amount, description);

  if (!m_opaque_up)
    return;

  std::optional<std::string> description_opt;
  if (description && description[0])
    description_opt = description;
  m_opaque_up->Increment(amount, std::move(description_opt));
}

void SBProgress::Finalize() {
  // The lldb_private::Progress object is designed to be RAII and send the end
  // progress event when it gets destroyed. So force our contained object to be
  // destroyed and send the progress end event. Clearing this object also allows
  // all other methods to quickly return without doing any work if they are
  // called after this method.
  m_opaque_up.reset();
}

lldb_private::Progress &SBProgress::ref() const { return *m_opaque_up; }
