// 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 'dart:isolate';
import 'dart:mojo_bindings' as bindings;
import 'dart:mojo_core' as core;
import 'dart:typed_data';

import 'package:mojo/dart/testing/expect.dart';

class EchoString {
  String a = null;

  EchoString();

  static const int encodedSize = bindings.kStructHeaderSize + 8;
  static EchoString decode(bindings.MojoDecoder decoder) {
    var val = new EchoString();
    var numBytes = decoder.readUint32();
    var numFields = decoder.readUint32();
    val.a = decoder.decodeStruct(bindings.MojoString);
    return val;
  }
  static void encode(bindings.MojoEncoder encoder, EchoString val) {
    encoder.writeUint32(encodedSize);
    encoder.writeUint32(1);
    encoder.encodeStruct(bindings.MojoString, val.a);
  }
}


class EchoStringResponse extends EchoString {
  static const int encodedSize = EchoString.encodedSize;
  static var decode = EchoString.decode;
  static var encode = EchoString.encode;
}


const int kEchoString_name = 0;
const int kEchoStringResponse_name = 1;

class EchoInterface extends bindings.Interface {
  EchoInterface(core.MojoMessagePipeEndpoint endpoint) : super(endpoint);

  bindings.Message handleMessage(bindings.MessageReader reader,
                                 Function messageHandler) {
    switch (reader.name) {
      case kEchoString_name:
        var es = reader.decodeStruct(EchoString);
        var response = messageHandler(es);
        return buildResponseWithID(EchoStringResponse,
                                   kEchoStringResponse_name,
                                   bindings.kMessageIsResponse,
                                   response);
        break;
      default:
        throw new Exception("Unexpected case");
        break;
    }
    return null;
  }
}


class EchoClient extends bindings.Client {
  EchoClient(core.MojoMessagePipeEndpoint endpoint) : super(endpoint);

  Future<EchoStringResponse> echoString(String a) {
    // compose message.
    var es = new EchoString();
    es.a = a;
    return enqueueMessageWithRequestID(EchoString,
                                       kEchoString_name,
                                       bindings.kMessageExpectsResponse,
                                       es);
  }

  void handleResponse(bindings.MessageReader reader) {
    switch (reader.name) {
      case kEchoStringResponse_name:
        var esr = reader.decodeStruct(EchoStringResponse);
        Completer c = completerQueue.removeAt(0);
        c.complete(esr);
        break;
      default:
        throw new Exception("Unexpected case");
        break;
    }
  }
}


void providerIsolate(core.MojoMessagePipeEndpoint endpoint) {
  var provider = new EchoInterface(endpoint);
  provider.listen((msg) {
    if (msg is EchoString) {
      var response = new EchoStringResponse();
      response.a = msg.a;
      return response;
    }
  });
}


Future<bool> runTest() async {
  var testCompleter = new Completer();

  var pipe = new core.MojoMessagePipe();
  var client = new EchoClient(pipe.endpoints[0]);
  await Isolate.spawn(providerIsolate, pipe.endpoints[1]);

  int n = 100;
  int count = 0;
  client.open();
  for (int i = 0; i < n; i++) {
    client.echoString("hello").then((response) {
      Expect.equals("hello", response.a);
      count++;
      if (i == (n - 1)) {
        client.close();
        testCompleter.complete(count);
      }
    });
  }

  return testCompleter.future;
}


Future runAwaitTest() async {
  var pipe = new core.MojoMessagePipe();
  var client = new EchoClient(pipe.endpoints[0]);
  await Isolate.spawn(providerIsolate, pipe.endpoints[1]);

  int n = 100;
  client.open();
  for (int i = 0; i < n; i++) {
    var response = await client.echoString("Hello");
    Expect.equals("Hello", response.a);
  }
  client.close();
}


main() async {
  Expect.equals(100, await runTest());
  await runAwaitTest();
}
