// 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_CONSOLE_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_CONSOLE_CONSOLE_H_

#include <map>

#include "src/developer/debug/zxdb/console/command.h"
#include "src/developer/debug/zxdb/console/console_context.h"
#include "src/lib/fxl/macros.h"
#include "src/lib/line_input/modal_line_input.h"

namespace zxdb {

class AsyncOutputBuffer;
class OutputBuffer;
class Session;

class Console {
 public:
  explicit Console(Session* session);
  virtual ~Console();

  static Console* get() { return singleton_; }

  ConsoleContext& context() { return context_; }

  fxl::WeakPtr<Console> GetWeakPtr();

  // Prints the first prompt to the screen. This only needs to be called once.
  virtual void Init() {}

  // Causes the message loop to exit the next time through.
  virtual void Quit() = 0;

  // Prints the buffer/string to the console.
  virtual void Output(const OutputBuffer& output) = 0;
  void Output(const std::string& s);
  void Output(const Err& err);

  // Synchronously prints the output if the async buffer is complete. Otherwise adds a listener and
  // prints the output to the console when it is complete.
  void Output(fxl::RefPtr<AsyncOutputBuffer> output);

  // Clears the contents of the console.
  virtual void Clear() = 0;

  // Asks the user a question. The possible answers are stored in the options struct.
  //
  // Callers should pass anything they want to print above the prompt in the |message|. It's
  // important to do this instead of calling Output() followed by ModalGetOption() because there
  // can theoretically be multiple prompts pendingx (in case they're triggered by async events)
  // and the message passed here will always get printed above the prompt when its turn comes.
  virtual void ModalGetOption(const line_input::ModalPromptOptions& options, OutputBuffer message,
                              const std::string& prompt,
                              line_input::ModalLineInput::ModalCompletionCallback cb) = 0;

  // Parses and dispatches the given line of input.
  virtual void ProcessInputLine(const std::string& line, CommandCallback callback = nullptr) = 0;

 protected:
  static Console* singleton_;
  ConsoleContext context_;

 private:
  // Track all asynchronous output pending. We want to store a reference and lookup by pointer, so
  // the object is duplicated here (RefPtr doesn't like to be put in a set).
  std::map<AsyncOutputBuffer*, fxl::RefPtr<AsyncOutputBuffer>> async_output_;

  fxl::WeakPtrFactory<Console> weak_factory_;

  FXL_DISALLOW_COPY_AND_ASSIGN(Console);
};

}  // namespace zxdb

#endif  // SRC_DEVELOPER_DEBUG_ZXDB_CONSOLE_CONSOLE_H_
