//===-- SBTrace.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/Target/Process.h"
#include "lldb/Utility/Instrumentation.h"

#include "lldb/API/SBDebugger.h"
#include "lldb/API/SBStructuredData.h"
#include "lldb/API/SBThread.h"
#include "lldb/API/SBTrace.h"

#include "lldb/Core/StructuredDataImpl.h"

#include <memory>

using namespace lldb;
using namespace lldb_private;
using namespace llvm;

SBTrace::SBTrace() { LLDB_INSTRUMENT_VA(this); }

SBTrace::SBTrace(const lldb::TraceSP &trace_sp) : m_opaque_sp(trace_sp) {
  LLDB_INSTRUMENT_VA(this, trace_sp);
}

SBTrace SBTrace::LoadTraceFromFile(SBError &error, SBDebugger &debugger,
                                   const SBFileSpec &trace_description_file) {
  LLDB_INSTRUMENT_VA(error, debugger, trace_description_file);

  Expected<lldb::TraceSP> trace_or_err = Trace::LoadPostMortemTraceFromFile(
      debugger.ref(), trace_description_file.ref());

  if (!trace_or_err) {
    error.SetErrorString(toString(trace_or_err.takeError()).c_str());
    return SBTrace();
  }

  return SBTrace(trace_or_err.get());
}

SBFileSpec SBTrace::SaveToDisk(SBError &error, const SBFileSpec &bundle_dir,
                               bool compact) {
  LLDB_INSTRUMENT_VA(this, error, bundle_dir, compact);

  error.Clear();
  SBFileSpec file_spec;

  if (!m_opaque_sp)
    error.SetErrorString("error: invalid trace");
  else if (Expected<FileSpec> desc_file =
               m_opaque_sp->SaveToDisk(bundle_dir.ref(), compact))
    file_spec.SetFileSpec(*desc_file);
  else
    error.SetErrorString(llvm::toString(desc_file.takeError()).c_str());

  return file_spec;
}

const char *SBTrace::GetStartConfigurationHelp() {
  LLDB_INSTRUMENT_VA(this);
  return m_opaque_sp ? m_opaque_sp->GetStartConfigurationHelp() : nullptr;
}

SBError SBTrace::Start(const SBStructuredData &configuration) {
  LLDB_INSTRUMENT_VA(this, configuration);
  SBError error;
  if (!m_opaque_sp)
    error.SetErrorString("error: invalid trace");
  else if (llvm::Error err =
               m_opaque_sp->Start(configuration.m_impl_up->GetObjectSP()))
    error.SetErrorString(llvm::toString(std::move(err)).c_str());
  return error;
}

SBError SBTrace::Start(const SBThread &thread,
                       const SBStructuredData &configuration) {
  LLDB_INSTRUMENT_VA(this, thread, configuration);

  SBError error;
  if (!m_opaque_sp)
    error.SetErrorString("error: invalid trace");
  else {
    if (llvm::Error err =
            m_opaque_sp->Start(std::vector<lldb::tid_t>{thread.GetThreadID()},
                               configuration.m_impl_up->GetObjectSP()))
      error.SetErrorString(llvm::toString(std::move(err)).c_str());
  }

  return error;
}

SBError SBTrace::Stop() {
  LLDB_INSTRUMENT_VA(this);
  SBError error;
  if (!m_opaque_sp)
    error.SetErrorString("error: invalid trace");
  else if (llvm::Error err = m_opaque_sp->Stop())
    error.SetErrorString(llvm::toString(std::move(err)).c_str());
  return error;
}

SBError SBTrace::Stop(const SBThread &thread) {
  LLDB_INSTRUMENT_VA(this, thread);
  SBError error;
  if (!m_opaque_sp)
    error.SetErrorString("error: invalid trace");
  else if (llvm::Error err = m_opaque_sp->Stop({thread.GetThreadID()}))
    error.SetErrorString(llvm::toString(std::move(err)).c_str());
  return error;
}

bool SBTrace::IsValid() {
  LLDB_INSTRUMENT_VA(this);
  return this->operator bool();
}

SBTrace::operator bool() const {
  LLDB_INSTRUMENT_VA(this);
  return (bool)m_opaque_sp;
}
