// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/developer/debug/zxdb/client/thread.h"

#include "src/developer/debug/zxdb/client/setting_schema_definition.h"
#include "src/developer/debug/zxdb/client/system.h"
#include "src/developer/debug/zxdb/client/target.h"

namespace zxdb {

// Schema Definition -------------------------------------------------------------------------------

const char* ClientSettings::Thread::kDebugStepping = "debug-stepping";
const char* ClientSettings::Thread::kDebugSteppingDescription =
    R"(  Enable very verbose debug logging for thread stepping.

  This is used by developers working on the debugger's internal thread
  controllers.)";

const char* ClientSettings::Thread::kDisplay = "display";
const char* ClientSettings::Thread::kDisplayDescription =
    R"(  Lists expressions and variables to print every time the debugger stops.

  An alternative to modifying this list is the "display" verb which appends
  an expression to the global list. It's an alias for:
    global set display += "<expression>")";

namespace {

static fxl::RefPtr<SettingSchema> CreateSchema() {
  auto schema = fxl::MakeRefCounted<SettingSchema>();
  schema->AddBool(ClientSettings::Thread::kDebugStepping,
                  ClientSettings::Thread::kDebugSteppingDescription, false);
  schema->AddList(ClientSettings::Thread::kDisplay, ClientSettings::Thread::kDisplayDescription);
  return schema;
}

}  // namespace

// Thread Implementation ---------------------------------------------------------------------------

Thread::Thread(Session* session)
    : ClientObject(session),
      // Implementations can set up fallbacks if needed.
      settings_(GetSchema(), nullptr),
      weak_factory_(this) {}

Thread::~Thread() = default;

fxl::WeakPtr<Thread> Thread::GetWeakPtr() { return weak_factory_.GetWeakPtr(); }

bool Thread::IsBlockedOnException() const {
  return GetState() == debug_ipc::ThreadRecord::State::kBlocked &&
         GetBlockedReason() == debug_ipc::ThreadRecord::BlockedReason::kException;
}

bool Thread::CurrentStopSupportsFrames() const {
  return IsBlockedOnException() || GetState() == debug_ipc::ThreadRecord::State::kCoreDump ||
         GetState() == debug_ipc::ThreadRecord::State::kSuspended;
}

fxl::RefPtr<SettingSchema> Thread::GetSchema() {
  // Will only run initialization once.
  InitializeSchemas();
  static fxl::RefPtr<SettingSchema> schema = CreateSchema();
  return schema;
}

}  // namespace zxdb
