// 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(); }

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

}  // namespace zxdb
