// 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:typed_data';
import 'mojo:bindings' as bindings;
import 'mojo:core' as core;

import 'package:mojo/dart/embedder/test/dart_to_cpp.mojom.dart';

class DartSideImpl implements DartSide {
  static const int BAD_VALUE = 13;
  static const int ELEMENT_BYTES = 1;
  static const int CAPACITY_BYTES = 64;

  DartSideStub _stub;
  CppSideProxy cppSide;

  Uint8List _sampleData;
  Uint8List _sampleMessage;
  Completer _completer;

  DartSideImpl(core.MojoMessagePipeEndpoint endpoint) {
    _stub = new DartSideStub.fromEndpoint(endpoint)
            ..delegate = this
            ..listen();
    _sampleData = new Uint8List(CAPACITY_BYTES);
    for (int i = 0; i < _sampleData.length; ++i) {
      _sampleData[i] = i;
    }
    _sampleMessage = new Uint8List(CAPACITY_BYTES);
    for (int i = 0; i < _sampleMessage.length; ++i) {
      _sampleMessage[i] = 255 - i;
    }
    _completer = new Completer();
  }

  EchoArgsList createEchoArgsList(List<EchoArgs> list) {
    return list.fold(null, (result, arg) {
      var element = new EchoArgsList();
      element.item = arg;
      element.next = result;
      return element;
    });
  }

  void setClient(bindings.ProxyBase proxy) {
    assert(cppSide == null);
    cppSide = proxy;
    cppSide.ptr.startTest();
  }

  void ping() {
    cppSide.ptr.pingResponse();
    _completer.complete(null);
    cppSide.close();
  }

  void echo(int numIterations, EchoArgs arg) {
    if (arg.si64 > 0) {
      arg.si64 = BAD_VALUE;
    }
    if (arg.si32 > 0) {
      arg.si32 = BAD_VALUE;
    }
    if (arg.si16 > 0) {
      arg.si16 = BAD_VALUE;
    }
    if (arg.si8 > 0) {
      arg.si8 = BAD_VALUE;
    }

    for (int i = 0; i < numIterations; ++i) {
      var dataPipe1 = new core.MojoDataPipe(ELEMENT_BYTES, CAPACITY_BYTES);
      var dataPipe2 = new core.MojoDataPipe(ELEMENT_BYTES, CAPACITY_BYTES);
      var messagePipe1 = new core.MojoMessagePipe();
      var messagePipe2 = new core.MojoMessagePipe();

      arg.dataHandle = dataPipe1.consumer;
      arg.messageHandle = messagePipe1.endpoints[0];

      var specialArg = new EchoArgs();
      specialArg.si64 = -1;
      specialArg.si32 = -1;
      specialArg.si16 = -1;
      specialArg.si8 = -1;
      specialArg.name = 'going';
      specialArg.dataHandle = dataPipe2.consumer;
      specialArg.messageHandle = messagePipe2.endpoints[0];

      dataPipe1.producer.write(_sampleData.buffer.asByteData());
      dataPipe2.producer.write(_sampleData.buffer.asByteData());
      messagePipe1.endpoints[1].write(_sampleMessage.buffer.asByteData());
      messagePipe2.endpoints[1].write(_sampleMessage.buffer.asByteData());

      cppSide.ptr.echoResponse(createEchoArgsList([arg, specialArg]));

      dataPipe1.producer.handle.close();
      dataPipe2.producer.handle.close();
      messagePipe1.endpoints[1].handle.close();
      messagePipe2.endpoints[1].handle.close();
    }
    cppSide.ptr.testFinished();
    _completer.complete(null);
    cppSide.close();
  }

  Future<bool> get future => _completer.future;
}


main(List args) {
  assert(args.length == 2);
  int mojoHandle = args[0];
  var rawHandle = new core.MojoHandle(mojoHandle);
  var endpoint = new core.MojoMessagePipeEndpoint(rawHandle);
  var dartSide = new DartSideImpl(endpoint);
  dartSide.future.then((_) {
    print('Success');
  });
}
