// Copyright (c) 2018, 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.

// @dart = 2.9

/// @assertion Future<bool> any(bool test(T element))
/// Checks whether test accepts any element provided by this stream.
///
/// Calls test on each element of the stream. If the call returns true, the
/// returned future is completed with true and processing stops.
///
/// @description Checks whether test accepts any element provided by this stream
/// and stops listening to the stream after the first matching element has been
/// found.
/// @author ngl@unipro.ru

import "dart:async";
import "dart:io";
import "../http_utils.dart";
import "../../../Utils/expect.dart";

var localhost = InternetAddress.loopbackIPv4;

Future<List<int>> anyElement(RawDatagramSocket receiver, int expectedValue,
    bool shouldFind, {Duration delay = const Duration(seconds: 2)}) {
  List<int> tested = [];
  Completer<List<int>> completer = new Completer<List<int>>();
  Future<List<int>> f = completer.future;

  bool test(RawSocketEvent x) {
    var d = receiver?.receive();
    if (d != null) {
      tested.add(d.data[0]);
      return d.data[0] == expectedValue;
    } else {
      return false;
    }
  }

  receiver.any((event) => test(event)).then((value) {
    Expect.equals(true, value);
    if (!completer.isCompleted) {
      receiver.close();
      completer.complete(tested);
    }
  });

  new Future.delayed(delay, () {
    if (!completer.isCompleted) {
      receiver.close();
      completer.complete(tested);
    }
  });
  return f;
}

check(int expectedValue, {int attempts = 5}) async {
  RawDatagramSocket producer = await RawDatagramSocket.bind(localhost, 0);
  RawDatagramSocket receiver = await RawDatagramSocket.bind(localhost, 0);
  List<List<int>> toSend = [[0], [1], [2], [3]];
  List<int> tested = [];
  if (expectedValue >= toSend.length) {
    return;
  }

  List<int> bytesSent;
  for (int i = 0; i < attempts; i++) {
    bytesSent =
        await sendDatagramOnce(producer, toSend, localhost, receiver.port);
    if (bytesSent[expectedValue] == 1) {
      producer.close();
      break;
    }
  }
  Expect.isTrue(bytesSent[expectedValue] == 1, "Required datagram wasn't sent");

  tested = await anyElement(receiver, expectedValue, true);
  Expect.isTrue(tested.length > 0);
  Expect.equals(expectedValue, tested[tested.length - 1]);
  if (tested.length > 1) {
    checkTested<int>(tested, expectedValue);
  }
}

main() {
  for (int i = 0; i < 4; i++) {
    check(i);
  }
}
