// Copyright 2021 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_DEBUG_AGENT_COMPONENT_MANAGER_H_
#define SRC_DEVELOPER_DEBUG_DEBUG_AGENT_COMPONENT_MANAGER_H_

#include <optional>
#include <string>
#include <vector>

#include "src/developer/debug/debug_agent/stdio_handles.h"
#include "src/developer/debug/shared/status.h"

namespace debug_agent {

class DebuggedJob;

// This class manages launching and monitoring Fuchsia components. It is a singleton owned by the
// DebugAgent.
//
// Mostly the debugger deals with processes. It has a limited ability to launch components which
// is handled by this class. Eventually we will need better integration with the Fuchsia component
// framework which would also be managed by this class.
class ComponentManager {
 public:
  virtual ~ComponentManager() = default;

  // Launches the component with the given command line.
  //
  // The root_job is the job for the attached component or system root job. The requirement is
  // that this job must cover where components are launched.
  virtual debug::Status LaunchComponent(DebuggedJob* root_job, const std::vector<std::string>& argv,
                                        uint64_t* component_id) = 0;

  // Notification that a process has started.
  //
  // If this process launch was a component, this function will fill in the given stdio handles
  // and return the id associated with the component launch.
  //
  // If it was not a component launch, returns false (the caller normally won't know if a launch is
  // a component without asking us, so it isn't necessarily an error).
  virtual uint64_t OnProcessStart(const std::string& filter, StdioHandles& out_stdio) = 0;
};

}  // namespace debug_agent

#endif  // SRC_DEVELOPER_DEBUG_DEBUG_AGENT_COMPONENT_MANAGER_H_
