// 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 'dart:async';

import 'package:mojo/application.dart';
import 'package:mojo/bindings.dart';
import 'package:mojo/core.dart';

import 'package:_mojo_for_test_only/test/pingpong_service.mojom.dart';

class PingPongClientImpl implements PingPongClient {
  final PingPongClientStub stub;
  Completer _completer;
  int _count;

  PingPongClientImpl.unbound(this._count, this._completer)
      : stub = new PingPongClientStub.unbound() {
    stub.impl = this;
  }

  void pong(int pongValue) {
    if (pongValue == _count) {
      _completer.complete(null);
      stub.close();
    }
  }
}

class PingPongServiceImpl implements PingPongService {
  PingPongServiceStub _stub;
  Application _application;
  PingPongClientProxy _pingPongClient;

  PingPongServiceImpl(this._application, MojoMessagePipeEndpoint endpoint) {
    _stub = new PingPongServiceStub.fromEndpoint(endpoint, this);
  }

  PingPongServiceImpl.fromStub(this._stub) {
    _stub.impl = this;
  }

  void setClient(Proxy proxy) {
    assert(_pingPongClient == null);
    _pingPongClient = proxy;
  }

  void ping(int pingValue) {
    if (_pingPongClient != null) {
      _pingPongClient.pong(pingValue + 1);
    }
  }

  Future pingTargetUrl(String url, int count,
      [Function responseFactory]) async {
    if (_application == null) {
      return responseFactory(false);
    }
    var completer = new Completer();
    var pingPongService = new PingPongServiceProxy.unbound();
    _application.connectToService(url, pingPongService);

    var pingPongClient = new PingPongClientImpl.unbound(count, completer);
    pingPongService.setClient(pingPongClient.stub);

    for (var i = 0; i < count; i++) {
      pingPongService.ping(i);
    }
    await completer.future;
    await pingPongService.close();

    return responseFactory(true);
  }

  Future pingTargetService(Proxy proxy, int count,
      [Function responseFactory]) async {
    var pingPongService = proxy;
    var completer = new Completer();
    var client = new PingPongClientImpl.unbound(count, completer);
    pingPongService.setClient(client.stub);

    for (var i = 0; i < count; i++) {
      pingPongService.ping(i);
    }
    await completer.future;
    await pingPongService.close();

    return responseFactory(true);
  }

  getPingPongService(PingPongServiceStub serviceStub) {
    var targetServiceProxy = new PingPongServiceProxy.unbound();
    _application.connectToService(
        "mojo:dart_pingpong_target", targetServiceProxy);

    // Pass along the interface request to another implementation of the
    // service.
    targetServiceProxy.getPingPongService(serviceStub);
    targetServiceProxy.close();
  }

  getPingPongServiceDelayed(PingPongServiceStub serviceStub) {
    Timer.run(() {
      var endpoint = serviceStub.ctrl.unbind();
      new Timer(const Duration(milliseconds: 10), () {
        var targetServiceProxy = new PingPongServiceProxy.unbound();
        _application.connectToService(
            "mojo:dart_pingpong_target", targetServiceProxy);

        // Pass along the interface request to another implementation of the
        // service.
        serviceStub.ctrl.bind(endpoint);
        targetServiceProxy.getPingPongService(serviceStub);
        targetServiceProxy.close();
      });
    });
  }

  void quit() {}
}

class PingPongApplication extends Application {
  PingPongApplication.fromHandle(MojoHandle handle) : super.fromHandle(handle);

  @override
  void acceptConnection(String requestorUrl, String resolvedUrl,
      ApplicationConnection connection) {
    connection.provideService(PingPongService.serviceName,
        (endpoint) => new PingPongServiceImpl(this, endpoint),
        description: PingPongServiceStub.serviceDescription);
  }
}

main(List args, Object handleToken) {
  MojoHandle appHandle = new MojoHandle(handleToken);
  new PingPongApplication.fromHandle(appHandle)
    ..onError = ((_) {
      MojoHandle.reportLeakedHandles();
    });
}
