// Copyright 2015 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 "shell/application_manager/shell_impl.h"

#include <utility>

#include "mojo/converters/url/url_type_converters.h"
#include "mojo/services/content_handler/interfaces/content_handler.mojom.h"
#include "shell/application_manager/application_manager.h"

using mojo::ApplicationConnector;
using mojo::ApplicationPtr;
using mojo::Array;
using mojo::InterfaceRequest;
using mojo::InterfaceHandle;
using mojo::ServiceProvider;
using mojo::ServiceProviderPtr;
using mojo::Shell;
using mojo::ShellPtr;
using mojo::String;

namespace shell {

// ShellImpl::ApplicationConnectorImpl -----------------------------------------

ShellImpl::ApplicationConnectorImpl::ApplicationConnectorImpl(Shell* shell)
    : shell_(shell) {}

ShellImpl::ApplicationConnectorImpl::~ApplicationConnectorImpl() {}

void ShellImpl::ApplicationConnectorImpl::ConnectToApplication(
    const String& app_url,
    InterfaceRequest<ServiceProvider> services,
    InterfaceHandle<mojo::ServiceProvider> exposed_services) {
  shell_->ConnectToApplication(app_url, std::move(services),
                               std::move(exposed_services));
}

void ShellImpl::ApplicationConnectorImpl::Duplicate(
    InterfaceRequest<ApplicationConnector> application_connector_request) {
  bindings_.AddBinding(this, std::move(application_connector_request));
}

// ShellImpl -------------------------------------------------------------------

ShellImpl::ShellImpl(ApplicationPtr application,
                     ApplicationManager* manager,
                     const Identity& identity,
                     const base::Closure& on_application_end)
    : manager_(manager),
      identity_(identity),
      on_application_end_(on_application_end),
      application_(std::move(application)),
      binding_(this),
      application_connector_impl_(this) {
  binding_.set_connection_error_handler(
      [this]() { manager_->OnShellImplError(this); });
}

ShellImpl::~ShellImpl() {
}

void ShellImpl::InitializeApplication(Array<String> args) {
  ShellPtr shell;
  binding_.Bind(GetProxy(&shell));
  application_->Initialize(std::move(shell), std::move(args),
                           identity_.url.spec());
}

void ShellImpl::ConnectToClient(const GURL& requested_url,
                                const GURL& requestor_url,
                                InterfaceRequest<ServiceProvider> services) {
  application_->AcceptConnection(String::From(requestor_url),
                                 std::move(services), nullptr,
                                 requested_url.spec());
}

void ShellImpl::ConnectToApplication(
    const String& app_url,
    InterfaceRequest<ServiceProvider> services,
    InterfaceHandle<mojo::ServiceProvider> exposed_services) {
  GURL app_gurl(app_url);
  if (!app_gurl.is_valid()) {
    LOG(ERROR) << "Error: invalid URL: " << app_url;
    return;
  }
  LOG_IF(ERROR, exposed_services) << "exposed_services no longer supported!";
  manager_->ConnectToApplication(app_gurl, identity_.url, std::move(services),
                                 base::Closure());
}

void ShellImpl::CreateApplicationConnector(
    InterfaceRequest<ApplicationConnector> application_connector_request) {
  application_connector_impl_.Duplicate(
      std::move(application_connector_request));
}

}  // namespace shell
