// 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/commands/verb_quit.h"

#include "src/developer/debug/zxdb/client/session.h"
#include "src/developer/debug/zxdb/console/command.h"
#include "src/developer/debug/zxdb/console/console.h"
#include "src/developer/debug/zxdb/console/console_context.h"
#include "src/developer/debug/zxdb/console/output_buffer.h"
#include "src/lib/fxl/strings/string_printf.h"

namespace zxdb {

namespace {

const char kQuitShortHelp[] = R"(quit / q / exit: Quits the debugger.)";
const char kQuitHelp[] =
    R"(quit

  Quits the debugger. It will prompt for confirmation if there are running
  processes.
)";

Err RunVerbQuit(ConsoleContext* context, const Command& cmd) {
  int running_processes = 0;
  for (Target* t : context->session()->system().GetTargets()) {
    if (t->GetState() != Target::kNone)
      running_processes++;
  }

  if (running_processes == 0) {
    // Nothing running, quit immediately.
    Console::get()->Quit();
    return Err();
  }

  OutputBuffer message;
  if (running_processes == 1) {
    message =
        OutputBuffer("\nAre you sure you want to quit and detach from the running process?\n");
  } else {
    message = OutputBuffer(
        fxl::StringPrintf("\nAre you sure you want to quit and detach from %d running processes?\n",
                          running_processes));
  }

  line_input::ModalPromptOptions options;
  options.require_enter = false;
  options.case_sensitive = false;
  options.options.push_back("y");
  options.options.push_back("n");
  options.cancel_option = "n";
  Console::get()->ModalGetOption(options, message, "y/n > ", [](const std::string& answer) {
    if (answer == "y")
      Console::get()->Quit();
  });

  return Err();
}

}  // namespace

VerbRecord GetQuitVerbRecord() {
  return VerbRecord(&RunVerbQuit, {"quit", "q", "exit"}, kQuitShortHelp, kQuitHelp,
                    CommandGroup::kGeneral);
}

}  // namespace zxdb
