// Copyright 2019 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 "src/lib/ui/base_view/embedded_view_utils.h"

#include <lib/syslog/cpp/macros.h>
#include <lib/ui/scenic/cpp/view_ref_pair.h>
#include <lib/ui/scenic/cpp/view_token_pair.h>

namespace scenic {

EmbeddedViewInfo LaunchComponentAndCreateView(const fuchsia::sys::LauncherPtr& launcher,
                                              const std::string& component_url,
                                              const std::vector<std::string>& component_args) {
  FX_DCHECK(launcher);

  EmbeddedViewInfo info;

  // Configure the information to launch the component with.
  fuchsia::sys::LaunchInfo launch_info;
  info.app_services = sys::ServiceDirectory::CreateWithRequest(&launch_info.directory_request);
  launch_info.url = component_url;
  launch_info.arguments =
      fidl::VectorPtr(std::vector<std::string>(component_args.begin(), component_args.end()));

  launcher->CreateComponent(std::move(launch_info), info.controller.NewRequest());

  info.view_provider = info.app_services->Connect<fuchsia::ui::app::ViewProvider>();

  auto [view_token, view_holder_token] = scenic::ViewTokenPair::New();
  info.view_holder_token = std::move(view_holder_token);

  auto [view_ref_control, view_ref] = scenic::ViewRefPair::New();
  fidl::Clone(view_ref, &info.view_ref);

  info.view_provider->CreateViewWithViewRef(std::move(view_token.value),
                                            std::move(view_ref_control), std::move(view_ref));

  return info;
}

}  // namespace scenic
