// 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 "/mojo/public/dart/application.dart";
import "dart:sky.internals" as internals;
import "mojo:bindings" as bindings;
import "mojo:core" 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;
  ServiceRegistry _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 ApplicationConection(
          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;
  }
}
