// 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/ipc/records.h"
#include "src/developer/debug/shared/status.h"

namespace debug_agent {

class DebugAgent;
class Filter;
class ProcessHandle;
class SystemInterface;

// This class manages launching and monitoring Fuchsia components. It is a singleton owned by the
// DebugAgent.
class ComponentManager {
 public:
  // ComponentManager needs |SystemInterface::GetParentJobKoid| for |FindComponentInfo|.
  explicit ComponentManager(SystemInterface* system_interface)
      : system_interface_(system_interface) {}
  virtual ~ComponentManager() = default;

  // Find the component information if the job is the root job of an ELF component.
  virtual std::optional<debug_ipc::ComponentInfo> FindComponentInfo(zx_koid_t job_koid) const = 0;

  // Find the component information if the process runs in the context of a component.
  std::optional<debug_ipc::ComponentInfo> FindComponentInfo(const ProcessHandle& process) const;

  // Set the debug_agent. ComponentManager needs a debug_agent to notify component starting and
  // exiting events.
  virtual void SetDebugAgent(DebugAgent* debug_agent) = 0;

  // Launches the component with the given command line.
  //
  // The component URL is in argv[0].
  virtual debug::Status LaunchComponent(const std::vector<std::string>& argv) = 0;

  // Launches a test.
  virtual debug::Status LaunchTest(std::string url, std::vector<std::string> case_filters) = 0;

  // Notification that a process has started.
  //
  // If the process starts because of a |LaunchComponent|, this function will fill in the given
  // stdio handles and return true.
  //
  // 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).
  //
  // |process_name_override| allows the component manager to override the process name observed
  // by the client and is optional.
  virtual bool OnProcessStart(const ProcessHandle& process, StdioHandles* out_stdio,
                              std::string* process_name_override) = 0;

 private:
  SystemInterface* system_interface_;
};

}  // namespace debug_agent

#endif  // SRC_DEVELOPER_DEBUG_DEBUG_AGENT_COMPONENT_MANAGER_H_
