// 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.

#ifndef SRC_DEVELOPER_DEBUG_ZXDB_CONSOLE_VERBS_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_CONSOLE_VERBS_H_

#include <map>
#include <string>
#include <vector>

#include "lib/fit/function.h"
#include "src/developer/debug/zxdb/common/err.h"
#include "src/developer/debug/zxdb/console/command_context.h"
#include "src/developer/debug/zxdb/console/command_group.h"
#include "src/developer/debug/zxdb/console/switch_record.h"

namespace zxdb {

class Command;
class ConsoleContext;

// Indicates whether a command implies either source or assembly context. This
// can be used by the frontend as a hint for what to show for the next stop.
enum class SourceAffinity {
  // The command applies to source code (e.g. "next").
  kSource,

  // The command applies to assembly code (e.g. "stepi", "disassemble").
  kAssembly,

  // This command does not imply any source or disassembly relation.
  kNone
};

enum class Verb {
  kNone = 0,

  kAspace,
  kAsyncBacktrace,
  kAttach,
  kAuth,
  kBacktrace,
  kBreak,
  kClear,
  kCls,
  kConnect,
  kContinue,
  kDetach,
  kDisable,
  kDisassemble,
  kDisconnect,
  kDisplay,
  kDown,
  kEnable,
  kFinish,
  kGet,
  kHandle,
  kHelp,
  kJump,
  kKill,
  kLibs,
  kList,
  kListProcesses,
  kLocals,
  kMemAnalyze,
  kMemRead,
  kNew,
  kNext,
  kNexti,
  kOpenDump,
  kPause,
  kPrint,
  kQuit,
  kRegs,
  kRm,
  kRun,
  kRunComponent,
  kRunTest,
  kSaveDump,
  kSet,
  kStackData,
  kStackUsage,
  kStatus,
  kStderr,
  kStdout,
  kStep,
  kStepi,
  kSteps,
  kSymDebug,
  kSymInfo,
  kSymNear,
  kSymSearch,
  kSymStat,
  kSysInfo,
  kUntil,
  kUp,
  kWatch,

  // Adding a new one? Add in one of the functions GetVerbs() calls.
  kLast  // Not a real verb, keep last.
};

struct VerbRecord {
  enum ParamType {
    // The parameters are separated on whitespace and each one is added to the Command::args.
    // It uses C-style string quoting for separating arguments containing whitespace.
    kWhitespaceSeparated,

    // All parameters after switches are treated as one string. Everything including whitespace,
    // quoted strings, and literal backslashes are assigned to Command::args[0].
    kOneParam,
  };

  // New-style executor that uses the CommandContext.
  using CommandExecutor = fit::function<void(const Command&, fxl::RefPtr<CommandContext>)>;

  // Type for the callback to complete the command's arguments. The command
  // will be filled out as far as is possible for the current parse, and the
  // completions should be filled with suggestions for the next token, each of
  // which should begin with the given prefix.
  using CommandCompleter = fit::function<void(const Command& command, const std::string& prefix,
                                              std::vector<std::string>* completions)>;

  VerbRecord();
  VerbRecord(VerbRecord&&) = default;

  // The help will be referenced by pointer. It is expected to be a static string.
  VerbRecord(CommandExecutor exec, std::initializer_list<std::string> aliases,
             const char* short_help, const char* usage, const char* help, CommandGroup group,
             SourceAffinity source_affinity = SourceAffinity::kNone);

  // This variant takes a completer.
  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 = SourceAffinity::kNone);

  ~VerbRecord();

  VerbRecord& operator=(VerbRecord&&) = default;

  CommandExecutor exec = nullptr;

  // These are the user-typed strings that will name this verb. The [0]th one
  // is the canonical name.
  std::vector<std::string> aliases;

  const char* short_help = nullptr;  // One-line help.
  const char* usage = nullptr;
  const char* help = nullptr;
  std::vector<SwitchRecord> switches;  // Switches supported by this verb.

  // Verbs should set this to true if they deal with things like paths or other information that
  // would generally be able to identify users.
  bool needs_elision = false;

  CommandGroup command_group = CommandGroup::kGeneral;
  SourceAffinity source_affinity = SourceAffinity::kNone;

  ParamType param_type = kWhitespaceSeparated;

  CommandCompleter complete = nullptr;
};

// Returns all known verbs. The contents of this map will never change once
// it is called.
const std::map<Verb, VerbRecord>& GetVerbs();

// Converts the given verb to the canonical name.
std::string VerbToString(Verb v);

// Returns the record for the given verb. If the verb is not registered (should
// not happen) or is kNone (this is what noun-only commands use), returns null.
const VerbRecord* GetVerbRecord(Verb verb);

// Returns the mapping from possible inputs to the noun/verb. This is an
// inverted version of the map returned by GetNouns()/GetVerbs();
const std::map<std::string, Verb>& GetStringVerbMap();

// These functions add records for the verbs they support to the given map.
void AppendSettingsVerbs(std::map<Verb, VerbRecord>* verbs);

}  // namespace zxdb

#endif  // SRC_DEVELOPER_DEBUG_ZXDB_CONSOLE_VERBS_H_
