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

import "package:mojo/public/dart/application.dart";
import "dart:sky.internals" as internals;
import "package:mojo/public/dart/bindings.dart" as bindings;
import "package:mojo/public/dart/core.dart" as core;
import "package:mojo/public/interfaces/application/service_provider.mojom.dart";
import "package:mojo/public/interfaces/application/shell.mojom.dart";
import "package:mojo/services/service_registry/public/interfaces/service_registry.mojom.dart";

final _EmbedderImpl embedder = new _EmbedderImpl();

class _EmbedderImpl {
  ApplicationConnection _connection;
  ServiceRegistryProxy _serviceRegistry;

  final ShellProxy shell = new ShellProxy.fromHandle(
      new core.MojoHandle(internals.takeShellProxyHandle()));

  ApplicationConnection get connection {
    if (_connection == null) {
      var stubHandle =
          new core.MojoHandle(internals.takeServicesProvidedToEmbedder());
      var proxyHandle =
          new core.MojoHandle(internals.takeServicesProvidedByEmbedder());
      _connection = new ApplicationConnection(stubHandle.isValid
          ? new ServiceProviderStub.fromHandle(stubHandle)
          : null, proxyHandle.isValid
          ? new ServiceProviderProxy.fromHandle(proxyHandle)
          : null);
    }
    return _connection;
  }

  ApplicationConnection connectToApplication(String url) {
    var proxy = new ServiceProviderProxy.unbound();
    var stub = new ServiceProviderStub.unbound();
    shell.ptr.connectToApplication(url, proxy, stub);
    return new ApplicationConnection(stub, proxy);
  }

  void connectToService(String url, bindings.ProxyBase proxy) {
    var appSp = new ServiceProviderProxy.unbound();
    shell.ptr.connectToApplication(url, appSp, null);
    var pipe = new core.MojoMessagePipe();
    proxy.impl.bind(pipe.endpoints[0]);
    appSp.ptr.connectToService(proxy.name, pipe.endpoints[1]);
    appSp.close();
  }

  ServiceRegistryProxy get serviceRegistry {
    if (_serviceRegistry == null) {
      _serviceRegistry = new ServiceRegistryProxy.fromHandle(
          new core.MojoHandle(internals.takeServiceRegistry()));
    }
    return _serviceRegistry;
  }
}
