// 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.

#include "peridot/bin/sessionmgr/agent_launcher.h"

#include <lib/fxl/logging.h>

namespace modular {
namespace {

constexpr char kEnvironmentLabel[] = "agent";

}  // namespace

component::Services AgentLauncher::StartAgent(
    const std::string& url,
    std::unique_ptr<maxwell::MaxwellServiceProviderBridge> bridge) {
  bridge_ = std::move(bridge);
  fuchsia::sys::ServiceListPtr service_list(new fuchsia::sys::ServiceList);
  service_list->names = bridge_->service_names().Clone();
  service_list->host_directory = bridge_->OpenAsDirectory();
  fuchsia::sys::EnvironmentPtr agent_env;
  environment_->CreateNestedEnvironment(
      agent_env.NewRequest(), /*controller=*/nullptr, kEnvironmentLabel,
      std::move(service_list), {});

  fuchsia::sys::LauncherPtr agent_launcher;
  agent_env->GetLauncher(agent_launcher.NewRequest());

  fuchsia::sys::LaunchInfo launch_info;
  launch_info.url = url;
  component::Services services;
  launch_info.directory_request = services.NewRequest();
  FXL_LOG(INFO) << "Starting modular agent " << url;
  agent_launcher->CreateComponent(std::move(launch_info), nullptr);
  return services;
}

}  // namespace modular
