// Copyright 2019 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/console/verbs.h"

#include <lib/syslog/cpp/macros.h>

#include "src/developer/debug/zxdb/console/commands/verb_aspace.h"
#include "src/developer/debug/zxdb/console/commands/verb_async_backtrace.h"
#include "src/developer/debug/zxdb/console/commands/verb_attach.h"
#include "src/developer/debug/zxdb/console/commands/verb_auth.h"
#include "src/developer/debug/zxdb/console/commands/verb_backtrace.h"
#include "src/developer/debug/zxdb/console/commands/verb_break.h"
#include "src/developer/debug/zxdb/console/commands/verb_clear.h"
#include "src/developer/debug/zxdb/console/commands/verb_cls.h"
#include "src/developer/debug/zxdb/console/commands/verb_connect.h"
#include "src/developer/debug/zxdb/console/commands/verb_continue.h"
#include "src/developer/debug/zxdb/console/commands/verb_detach.h"
#include "src/developer/debug/zxdb/console/commands/verb_disable.h"
#include "src/developer/debug/zxdb/console/commands/verb_disassemble.h"
#include "src/developer/debug/zxdb/console/commands/verb_disconnect.h"
#include "src/developer/debug/zxdb/console/commands/verb_display.h"
#include "src/developer/debug/zxdb/console/commands/verb_down.h"
#include "src/developer/debug/zxdb/console/commands/verb_enable.h"
#include "src/developer/debug/zxdb/console/commands/verb_exception_info.h"
#include "src/developer/debug/zxdb/console/commands/verb_finish.h"
#include "src/developer/debug/zxdb/console/commands/verb_handle.h"
#include "src/developer/debug/zxdb/console/commands/verb_help.h"
#include "src/developer/debug/zxdb/console/commands/verb_jump.h"
#include "src/developer/debug/zxdb/console/commands/verb_kill.h"
#include "src/developer/debug/zxdb/console/commands/verb_libs.h"
#include "src/developer/debug/zxdb/console/commands/verb_list.h"
#include "src/developer/debug/zxdb/console/commands/verb_locals.h"
#include "src/developer/debug/zxdb/console/commands/verb_mem_analyze.h"
#include "src/developer/debug/zxdb/console/commands/verb_mem_read.h"
#include "src/developer/debug/zxdb/console/commands/verb_new.h"
#include "src/developer/debug/zxdb/console/commands/verb_next.h"
#include "src/developer/debug/zxdb/console/commands/verb_nexti.h"
#include "src/developer/debug/zxdb/console/commands/verb_opendump.h"
#include "src/developer/debug/zxdb/console/commands/verb_pause.h"
#include "src/developer/debug/zxdb/console/commands/verb_print.h"
#include "src/developer/debug/zxdb/console/commands/verb_ps.h"
#include "src/developer/debug/zxdb/console/commands/verb_quit.h"
#include "src/developer/debug/zxdb/console/commands/verb_regs.h"
#include "src/developer/debug/zxdb/console/commands/verb_rm.h"
#include "src/developer/debug/zxdb/console/commands/verb_run.h"
#include "src/developer/debug/zxdb/console/commands/verb_run_component.h"
#include "src/developer/debug/zxdb/console/commands/verb_run_test.h"
#include "src/developer/debug/zxdb/console/commands/verb_savedump.h"
#include "src/developer/debug/zxdb/console/commands/verb_stack_data.h"
#include "src/developer/debug/zxdb/console/commands/verb_stack_usage.h"
#include "src/developer/debug/zxdb/console/commands/verb_status.h"
#include "src/developer/debug/zxdb/console/commands/verb_stderr.h"
#include "src/developer/debug/zxdb/console/commands/verb_stdout.h"
#include "src/developer/debug/zxdb/console/commands/verb_step.h"
#include "src/developer/debug/zxdb/console/commands/verb_stepi.h"
#include "src/developer/debug/zxdb/console/commands/verb_steps.h"
#include "src/developer/debug/zxdb/console/commands/verb_sym_debug.h"
#include "src/developer/debug/zxdb/console/commands/verb_sym_info.h"
#include "src/developer/debug/zxdb/console/commands/verb_sym_near.h"
#include "src/developer/debug/zxdb/console/commands/verb_sym_search.h"
#include "src/developer/debug/zxdb/console/commands/verb_sym_stat.h"
#include "src/developer/debug/zxdb/console/commands/verb_sys_info.h"
#include "src/developer/debug/zxdb/console/commands/verb_until.h"
#include "src/developer/debug/zxdb/console/commands/verb_up.h"
#include "src/developer/debug/zxdb/console/commands/verb_watch.h"

namespace zxdb {

VerbRecord::VerbRecord() = default;

VerbRecord::VerbRecord(CommandExecutor exec, std::initializer_list<std::string> aliases,
                       const char* short_help, const char* usage, const char* help,
                       CommandGroup group, SourceAffinity source_affinity)
    : exec(std::move(exec)),
      aliases(aliases),
      short_help(short_help),
      usage(usage),
      help(help),
      command_group(group),
      source_affinity(source_affinity) {}

VerbRecord::VerbRecord(CommandExecutor exec, CommandCompleter complete,
                       std::initializer_list<std::string> aliases, const char* short_help,
                       const char* usage, const char* help, CommandGroup group,
                       SourceAffinity source_affinity)
    : exec(std::move(exec)),
      aliases(aliases),
      short_help(short_help),
      usage(usage),
      help(help),
      command_group(group),
      source_affinity(source_affinity),
      complete(std::move(complete)) {}

VerbRecord::~VerbRecord() = default;

const std::map<Verb, VerbRecord>& GetVerbs() {
  static std::map<Verb, VerbRecord> all_verbs;
  if (all_verbs.empty()) {
    AppendSettingsVerbs(&all_verbs);

    all_verbs[Verb::kAspace] = GetAspaceVerbRecord();
    all_verbs[Verb::kAsyncBacktrace] = GetAsyncBacktraceVerbRecord();
    all_verbs[Verb::kAttach] = GetAttachVerbRecord();
    all_verbs[Verb::kAuth] = GetAuthVerbRecord();
    all_verbs[Verb::kBacktrace] = GetBacktraceVerbRecord();
    all_verbs[Verb::kBreak] = GetBreakVerbRecord();
    all_verbs[Verb::kClear] = GetClearVerbRecord();
    all_verbs[Verb::kCls] = GetClsVerbRecord();
    all_verbs[Verb::kConnect] = GetConnectVerbRecord();
    all_verbs[Verb::kContinue] = GetContinueVerbRecord();
    all_verbs[Verb::kDetach] = GetDetachVerbRecord();
    all_verbs[Verb::kDisable] = GetDisableVerbRecord();
    all_verbs[Verb::kDisconnect] = GetDisconnectVerbRecord();
    all_verbs[Verb::kDisassemble] = GetDisassembleVerbRecord();
    all_verbs[Verb::kDisplay] = GetDisplayVerbRecord();
    all_verbs[Verb::kDown] = GetDownVerbRecord();
    all_verbs[Verb::kEnable] = GetEnableVerbRecord();
    all_verbs[Verb::kExceptionInfo] = GetExceptionInfoVerbRecord();
    all_verbs[Verb::kFinish] = GetFinishVerbRecord();
    all_verbs[Verb::kHandle] = GetHandleVerbRecord();
    all_verbs[Verb::kHelp] = GetHelpVerbRecord();
    all_verbs[Verb::kJump] = GetJumpVerbRecord();
    all_verbs[Verb::kKill] = GetKillVerbRecord();
    all_verbs[Verb::kLibs] = GetLibsVerbRecord();
    all_verbs[Verb::kList] = GetListVerbRecord();
    all_verbs[Verb::kListProcesses] = GetPsVerbRecord();
    all_verbs[Verb::kLocals] = GetLocalsVerbRecord();
    all_verbs[Verb::kMemAnalyze] = GetMemAnalyzeVerbRecord();
    all_verbs[Verb::kMemRead] = GetMemReadVerbRecord();
    all_verbs[Verb::kNew] = GetNewVerbRecord();
    all_verbs[Verb::kNext] = GetNextVerbRecord();
    all_verbs[Verb::kNexti] = GetNextiVerbRecord();
    all_verbs[Verb::kOpenDump] = GetOpendumpVerbRecord();
    all_verbs[Verb::kPause] = GetPauseVerbRecord();
    all_verbs[Verb::kPrint] = GetPrintVerbRecord();
    all_verbs[Verb::kQuit] = GetQuitVerbRecord();
    all_verbs[Verb::kRegs] = GetRegsVerbRecord();
    all_verbs[Verb::kRm] = GetRmVerbRecord();
    all_verbs[Verb::kRun] = GetRunVerbRecord();
    all_verbs[Verb::kRunComponent] = GetRunComponentVerbRecord();
    all_verbs[Verb::kRunTest] = GetRunTestVerbRecord();
    all_verbs[Verb::kSaveDump] = GetSaveDumpVerbRecord();
    all_verbs[Verb::kStatus] = GetStatusVerbRecord();
    all_verbs[Verb::kStdout] = GetStdoutVerbRecord();
    all_verbs[Verb::kStderr] = GetStderrVerbRecord();
    all_verbs[Verb::kStep] = GetStepVerbRecord();
    all_verbs[Verb::kStepi] = GetStepiVerbRecord();
    all_verbs[Verb::kSteps] = GetStepsVerbRecord();
    all_verbs[Verb::kSymDebug] = GetSymDebugVerbRecord();
    all_verbs[Verb::kSymInfo] = GetSymInfoVerbRecord();
    all_verbs[Verb::kSymNear] = GetSymNearVerbRecord();
    all_verbs[Verb::kSymSearch] = GetSymSearchVerbRecord();
    all_verbs[Verb::kSymStat] = GetSymStatVerbRecord();
    all_verbs[Verb::kSysInfo] = GetSysInfoVerbRecord();
    all_verbs[Verb::kStackData] = GetStackDataVerbRecord();
    all_verbs[Verb::kStackUsage] = GetStackUsageVerbRecord();
    all_verbs[Verb::kUntil] = GetUntilVerbRecord();
    all_verbs[Verb::kUp] = GetUpVerbRecord();
    all_verbs[Verb::kWatch] = GetWatchVerbRecord();

    // Everything but Noun::kNone (= 0) should be in the map.
    FX_DCHECK(all_verbs.size() == static_cast<size_t>(Verb::kLast) - 1)
        << "You need to update the verb lookup table for additions to Verbs.";
  }
  return all_verbs;
}

const VerbRecord* GetVerbRecord(Verb verb) {
  const auto& verbs = GetVerbs();
  auto found = verbs.find(verb);
  if (found == verbs.end())
    return nullptr;
  return &found->second;
}

const std::map<std::string, Verb>& GetStringVerbMap() {
  static std::map<std::string, Verb> map;
  if (map.empty()) {
    // Build up the reverse-mapping from alias to verb enum.
    for (const auto& verb_pair : GetVerbs()) {
      for (const auto& alias : verb_pair.second.aliases)
        map[alias] = verb_pair.first;
    }
  }
  return map;
}

std::string VerbToString(Verb v) {
  const auto& verbs = GetVerbs();
  auto found = verbs.find(v);
  if (found == verbs.end())
    return std::string();
  return found->second.aliases[0];
}

}  // namespace zxdb
