// Copyright 2016 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 GARNET_BIN_TRACE_COMMAND_H_
#define GARNET_BIN_TRACE_COMMAND_H_

#include <fuchsia/tracing/controller/cpp/fidl.h>
#include <lib/fit/function.h>
#include <lib/sys/cpp/component_context.h>

#include <iosfwd>
#include <map>
#include <memory>
#include <string>

#include "src/lib/fxl/command_line.h"

namespace tracing {

namespace controller = ::fuchsia::tracing::controller;

class Command {
 public:
  // OnDoneCallback is the callback type invoked when a command finished
  // running. It takes as argument the return code to exit the process with.
  using OnDoneCallback = fit::function<void(int32_t)>;
  struct Info {
    using CommandFactory = fit::function<std::unique_ptr<Command>(sys::ComponentContext*)>;

    CommandFactory factory;
    std::string name;
    std::string usage;
    std::map<std::string, std::string> options;
  };

  virtual ~Command();

  void Run(const fxl::CommandLine& command_line, OnDoneCallback on_done);

 protected:
  static std::ostream& out();
  static std::istream& in();

  explicit Command(sys::ComponentContext* context);

  sys::ComponentContext* context();
  sys::ComponentContext* context() const;

  // Starts running the command.
  // The command must invoke Done() when finished.
  virtual void Start(const fxl::CommandLine& command_line) = 0;
  void Done(int32_t return_code);

 private:
  sys::ComponentContext* context_;
  OnDoneCallback on_done_;
  int32_t return_code_ = -1;

  Command(const Command&) = delete;
  Command(Command&&) = delete;
  Command& operator=(const Command&) = delete;
  Command& operator=(Command&&) = delete;
};

class CommandWithController : public Command {
 protected:
  explicit CommandWithController(sys::ComponentContext* context);

  controller::ControllerPtr& controller() { return controller_; }
  const controller::ControllerPtr& controller() const { return controller_; }

 private:
  std::unique_ptr<sys::ComponentContext> context_;
  controller::ControllerPtr controller_;

  CommandWithController(const CommandWithController&) = delete;
  CommandWithController(CommandWithController&&) = delete;
  CommandWithController& operator=(const CommandWithController&) = delete;
  CommandWithController& operator=(CommandWithController&&) = delete;
};

}  // namespace tracing

#endif  // GARNET_BIN_TRACE_COMMAND_H_
