// Copyright 2020 The Fuchsia 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 'package:fxtest/fxtest.dart';

/// Utility which applies sanity checks to make sure we both 1) actually want
/// to execute tests, and 2) are set up to get correct output.
// ignore: one_member_abstracts
abstract class Checklist {
  Future<bool> isDeviceReady(List<TestBundle> bundles);
}

class PreChecker implements Checklist {
  final Function(TestEvent) eventSink;
  final TestsConfig testsConfig;

  PreChecker({
    required this.eventSink,
    required this.testsConfig,
  });

  factory PreChecker.fromConfig(
    TestsConfig testsConfig, {
    required Function(TestEvent) eventSink,
  }) {
    return PreChecker(
      testsConfig: testsConfig,
      eventSink: eventSink,
    );
  }

  bool hasDeviceTests(List<TestBundle> testBundles) {
    return testBundles
        .any((e) => !hostTestTypes.contains(e.testDefinition.testType));
  }

  @override
  Future<bool> isDeviceReady(List<TestBundle> testBundles) async {
    if (!hasDeviceTests(testBundles)) return true;

    // check for a running update server
    bool isPackageServerRunning = await fxCommandRunWithIO(
      eventSink,
      testsConfig.wrapWith,
      testsConfig.fxEnv.fx,
      'is-package-server-running',
    ).then((process) => process.exitCode).then((exitCode) => exitCode == 0);
    if (!isPackageServerRunning) {
      return false;
    }

    if (testsConfig.flags.shouldUpdateIfInBase) {
      // if any test is on base, perform an OTA first
      Iterable<String> allTestNames = testBundles
          .where((e) => e.testDefinition.testType != TestType.host)
          .map((e) => e.testDefinition.name);
      // TODO: update-if-in-base can't handle large numbers of command-line
      // arguments. The code below paginates and calls it with batches of
      // 50 non-host tests to avoid command line buffer issues. In the future,
      // update-if-in-base and is-package-server-running should have pure Dart
      // implementations.
      Iterable<String> batch;
      while ((batch = allTestNames.take(50)).isNotEmpty) {
        bool result = await fxCommandRunWithIO(
          eventSink,
          testsConfig.wrapWith,
          testsConfig.fxEnv.fx,
          'update-if-in-base',
          batch.toList(),
        ).then((process) => process.exitCode).then((exitCode) => exitCode == 0);
        if (!result) {
          return false;
        }
        allTestNames = allTestNames.skip(50);
      }
    }
    return true;
  }
}
