// Copyright 2016 The Vanadium 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 'helper.dart';
import '../mobile/device.dart';
import '../mobile/device_spec.dart';
import '../mobile/android.dart';
import '../algorithms/matching.dart';
import '../globals.dart';
import '../runner/mdtest_command.dart';
import '../test/coverage_collector.dart';

class RunCommand extends MDTestCommand {

  @override
  final String name = 'run';

  @override
  final String description = 'Run multi-device driver tests';

  dynamic _specs;

  List<Device> _devices;

  @override
  Future<int> runCore() async {
    printInfo('Running "mdtest run command" ...');

    this._specs = await loadSpecs(argResults['specs']);
    printTrace(_specs.toString());

    this._devices = await getDevices();
    if (_devices.isEmpty) {
      printError('No device found.');
      return 1;
    }

    List<DeviceSpec> allDeviceSpecs
      = await constructAllDeviceSpecs(_specs['devices']);
    Map<DeviceSpec, Set<Device>> individualMatches
      = findIndividualMatches(allDeviceSpecs, _devices);
    Map<DeviceSpec, Device> deviceMapping
      = findMatchingDeviceMapping(allDeviceSpecs, individualMatches);
    if(deviceMapping == null) {
      printError('No device specs to devices mapping is found.');
      return 1;
    }

    MDTestRunner runner = new MDTestRunner();

    if (await runner.runAllApps(deviceMapping) != 0) {
      printError('Error when running applications');
      await uninstallTestedApps(deviceMapping);
      return 1;
    }

    await storeMatches(deviceMapping);

    bool testsFailed;
    if (argResults['format'] == 'tap') {
      testsFailed = await runner.runAllTestsToTAP(_specs['test-paths']) != 0;
    } else {
      testsFailed = await runner.runAllTests(_specs['test-paths']) != 0;
    }

    assert(testsFailed != null);
    if (testsFailed) {
      printError('Some tests failed');
    } else {
      printInfo('All tests passed');
    }

    if (argResults['coverage']) {
      Map<String, CoverageCollector> collectorPool
        = <String, CoverageCollector>{};
      buildCoverageCollectionTasks(deviceMapping, collectorPool);
      printTrace('Collecting code coverage hitmap (this may take some time)');
      await runCoverageCollectionTasks(collectorPool);
      printInfo('Computing code coverage for each application ...');
      if (await computeAppsCoverage(collectorPool, name) != 0) {
        await uninstallTestedApps(deviceMapping);
        return 1;
      }
    }

    await uninstallTestedApps(deviceMapping);

    return 0;
  }

  RunCommand() {
    usesSpecsOption();
    usesCoverageFlag();
    usesTAPReportOption();
  }
}
