// Copyright 2018 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:flutter_driver/driver_extension.dart';
import 'package:flutter/services.dart';
import 'package:splash_screen_kitchen_sink/main.dart' as app;

Completer<String> dataHandlerCompleter;
final List<String> appToHostMessageQueue = <String>[];

/// How this test works:
/// 1. Android's UI changes as the app starts up.
/// 2. Android sends messages to this Flutter app about those UI changes.
/// 3. This Flutter app forwards those messages from the app to the host
///    machine running the driver test.
/// 4. The driver test evaluates the UI change events to determine if the
///    behavior is expected or unexpected and then passes or fails the test.
void main() {
  enableFlutterDriverExtension(handler: respondToHostRequestForSplashLog);

  createTestChannelBetweenAndroidAndFlutter();

  app.main();
}

Future<String> respondToHostRequestForSplashLog(String _) {
  if (appToHostMessageQueue.isNotEmpty) {
    return Future<String>.value(appToHostMessageQueue.removeAt(0));
  } else {
    dataHandlerCompleter = Completer<String>();
    return dataHandlerCompleter.future;
  }
}

void createTestChannelBetweenAndroidAndFlutter() {
  // Channel used for Android to send Flutter changes to the splash display.
  const BasicMessageChannel<String> testChannel = BasicMessageChannel<String>(
      'testChannel',
      StringCodec()
  );

  // Every splash display change message that we receive from Android is either
  // immediately sent to the host driver test, or queued up to be sent to the
  // host driver test at the next opportunity.
  testChannel.setMessageHandler((String message) async {
    appToHostMessageQueue.add(message);
    if (dataHandlerCompleter != null) {
      dataHandlerCompleter.complete(appToHostMessageQueue.removeAt(0));
    }
    return '';
  });
}