// Copyright 2014 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/echo_service.mojom.dart';

class EchoServiceImpl implements EchoService {
  EchoServiceStub _stub;
  Application _application;

  EchoServiceImpl(this._application, MojoMessagePipeEndpoint endpoint) {
    _stub = new EchoServiceStub.fromEndpoint(endpoint, this);
  }

  dynamic echoString(String value, [Function responseFactory]) {
    if (value == "quit") {
      _stub.close();
    }
    return responseFactory(value);
  }

  dynamic delayedEchoString(String value, int millis,
      [Function responseFactory]) {
    if (value == "quit") {
      _stub.close();
    }
    return new Future.delayed(
        new Duration(milliseconds: millis), () => responseFactory(value));
  }

  void swap() {
    _swapImpls(this);
  }

  void quit() {}

  static void _swapImpls(EchoServiceImpl impl) {
    final stub = impl._stub;
    final app = impl._application;
    // It is not allowed to do an unbind in the midst of handling an event, so
    // it is delayed until popping back out to the event loop.
    Timer.run(() {
      final endpoint = stub.ctrl.unbind();
      new EchoServiceImpl(app, endpoint);
    });
  }
}

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

  @override
  void acceptConnection(String requestorUrl, String resolvedUrl,
      ApplicationConnection connection) {
    connection.provideService(EchoService.serviceName,
        (endpoint) => new EchoServiceImpl(this, endpoint));
  }
}

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