// Copyright 2016 The Chromium 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 "services/ui/launcher/launch_instance.h"

#include "base/command_line.h"
#include "base/logging.h"
#include "base/trace_event/trace_event.h"
#include "mojo/application/application_runner_chromium.h"
#include "mojo/public/c/system/main.h"
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/public/cpp/application/connect.h"
#include "mojo/services/ui/views/interfaces/view_provider.mojom.h"
#include "services/ui/launcher/launcher_view_tree.h"

namespace launcher {

LaunchInstance::LaunchInstance(mojo::ApplicationImpl* app_impl,
                               const std::string& app_url,
                               const base::Closure& shutdown_callback)
    : app_impl_(app_impl),
      app_url_(app_url),
      shutdown_callback_(shutdown_callback),
      viewport_event_dispatcher_binding_(this) {}

LaunchInstance::~LaunchInstance() {}

void LaunchInstance::Launch() {
  DVLOG(1) << "Launching " << app_url_;
  TRACE_EVENT0("launcher", __func__);

  mojo::ConnectToService(app_impl_->shell(), "mojo:compositor_service",
                         GetProxy(&compositor_));
  compositor_.set_connection_error_handler(base::Bind(
      &LaunchInstance::OnCompositorConnectionError, base::Unretained(this)));

  mojo::ConnectToService(app_impl_->shell(), "mojo:view_manager_service",
                         GetProxy(&view_manager_));
  view_manager_.set_connection_error_handler(base::Bind(
      &LaunchInstance::OnViewManagerConnectionError, base::Unretained(this)));

  InitViewport();

  mojo::ui::ViewProviderPtr client_view_provider;
  mojo::ConnectToService(app_impl_->shell(), app_url_,
                         GetProxy(&client_view_provider));

  client_view_provider->CreateView(GetProxy(&client_view_owner_), nullptr,
                                   nullptr);
}

void LaunchInstance::OnCompositorConnectionError() {
  LOG(ERROR) << "Exiting due to compositor connection error.";
  shutdown_callback_.Run();
}

void LaunchInstance::OnViewManagerConnectionError() {
  LOG(ERROR) << "Exiting due to view manager connection error.";
  shutdown_callback_.Run();
}

void LaunchInstance::InitViewport() {
  mojo::ConnectToService(app_impl_->shell(), "mojo:native_viewport_service",
                         GetProxy(&viewport_));
  viewport_.set_connection_error_handler(base::Bind(
      &LaunchInstance::OnViewportConnectionError, base::Unretained(this)));

  mojo::NativeViewportEventDispatcherPtr dispatcher;
  viewport_event_dispatcher_binding_.Bind(GetProxy(&dispatcher));
  viewport_->SetEventDispatcher(dispatcher.Pass());

  // Match the Nexus 5 aspect ratio initially.
  auto size = mojo::Size::New();
  size->width = 320;
  size->height = 640;

  auto requested_configuration = mojo::SurfaceConfiguration::New();
  viewport_->Create(
      size.Clone(), requested_configuration.Pass(),
      base::Bind(&LaunchInstance::OnViewportCreated, base::Unretained(this)));
}

void LaunchInstance::OnViewportConnectionError() {
  LOG(ERROR) << "Exiting due to viewport connection error.";
  shutdown_callback_.Run();
}

void LaunchInstance::OnViewportCreated(mojo::ViewportMetricsPtr metrics) {
  viewport_->Show();

  mojo::ContextProviderPtr context_provider;
  viewport_->GetContextProvider(GetProxy(&context_provider));

  view_tree_.reset(new LauncherViewTree(compositor_.get(), view_manager_.get(),
                                        context_provider.Pass(), metrics.Pass(),
                                        shutdown_callback_));
  view_tree_->SetRoot(client_view_owner_.Pass());

  RequestUpdatedViewportMetrics();
}

void LaunchInstance::OnViewportMetricsChanged(
    mojo::ViewportMetricsPtr metrics) {
  if (view_tree_) {
    view_tree_->SetViewportMetrics(metrics.Pass());
    RequestUpdatedViewportMetrics();
  }
}

void LaunchInstance::RequestUpdatedViewportMetrics() {
  viewport_->RequestMetrics(base::Bind(
      &LaunchInstance::OnViewportMetricsChanged, base::Unretained(this)));
}

void LaunchInstance::OnEvent(mojo::EventPtr event,
                             const mojo::Callback<void()>& callback) {
  if (view_tree_)
    view_tree_->DispatchEvent(event.Pass());
  callback.Run();
}

}  // namespace launcher
