// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// VMOptions=--enable-isolate-groups
// VMOptions=--no-enable-isolate-groups

import 'dart:async';
import 'dart:isolate';
import 'dart:math';
import 'dart:typed_data';

import 'package:async_helper/async_helper.dart' show asyncStart, asyncEnd;
import 'package:expect/expect.dart';

Uint8List generateSampleList(final int size) {
  final list = Uint8List(size);
  for (int i = 0; i < size; i++) {
    list[i] = i % 243;
  }
  return list;
}

void validateReceivedList(final int expectedSize, final list) {
  Expect.equals(expectedSize, list.length);
  // probe few elements
  for (int i = 0;
      i < list.length;
      i += max<num>(1, expectedSize ~/ 1000) as int) {
    Expect.equals(i % 243, list[i]);
  }
}

Future<Null> testSend(
    bool transferable, int toIsolateSize, int fromIsolateSize) async {
  asyncStart();
  final port = ReceivePort();
  final inbox = StreamIterator(port);
  await Isolate.spawn(isolateMain,
      [transferable, toIsolateSize, fromIsolateSize, port.sendPort]);
  await inbox.moveNext();
  final outbox = inbox.current;
  final workWatch = Stopwatch();
  final data = generateSampleList(toIsolateSize);
  int count = 10;
  workWatch.start();
  while (count-- > 0) {
    outbox.send(transferable ? TransferableTypedData.fromList([data]) : data);
    await inbox.moveNext();
    validateReceivedList(
        fromIsolateSize,
        transferable
            ? inbox.current.materialize().asUint8List()
            : inbox.current);
  }
  print('total ${workWatch.elapsedMilliseconds}ms');
  outbox.send(null);
  port.close();
  asyncEnd();
}

main() async {
  asyncStart();
  int bignum = 10 * 1000 * 1000;
  await testSend(false, bignum, 1); // none
  await testSend(true, bignum, 1); // 31959tr
  await testSend(false, bignum, 1); // 31960
  await testSend(true, bignum, 1); // 31960tr
  asyncEnd();
}

Future<Null> isolateMain(List config) async {
  bool transferable = config[0];
  int toIsolateSize = config[1];
  int fromIsolateSize = config[2];
  SendPort outbox = config[3];

  final port = ReceivePort();
  final inbox = StreamIterator(port);
  outbox.send(port.sendPort);
  final data = generateSampleList(fromIsolateSize);
  while (true) {
    await inbox.moveNext();
    if (inbox.current == null) {
      break;
    }
    validateReceivedList(
        toIsolateSize,
        transferable
            ? inbox.current.materialize().asUint8List()
            : inbox.current);
    outbox.send(transferable ? TransferableTypedData.fromList([data]) : data);
  }
  port.close();
}
