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

import 'dart:async';
import 'package:path/path.dart' as path;
import 'result_json_models.dart';
import '../util.dart';

/// Calls test.py with arguments gathered from a specific [configuration] and
/// lists all tests included for that particular configuration.
Future<Iterable<String>> testLister(Configuration configuration) async {
  var args = configuration.toArgs()..add("--list");
  return (await callTestPy(args))
      .map((line) => line.trim())
      .where((name) => name.isNotEmpty);
}

/// Calls test.py with arguments gathered from a specific [configuration] and
/// lists all status files included for that particular configuration.
Future<Iterable<String>> statusFileLister(Configuration configuration) async {
  List<String> args = configuration.toArgs()..add("--list-status-files");
  return (await callTestPy(args)).where((name) => name.isNotEmpty);
}

/// Calls test.py with arguments and returns the result.
Future<Iterable<String>> callTestPy(List<String> args) async {
  var testPyPath = path.absolute(PathHelper.testPyPath());
  var result = await runPython(testPyPath, args);
  if (result.exitCode != 0) {
    throw "Failed to call test.py: "
        "'${PathHelper.testPyPath()} ${args.join(' ')}'. "
        "Process exited with ${result.exitCode}";
  }
  return (result.stdout as String).split(newLine).skip(1);
}

/// Calls test.py with arguments gathered from a specific [configuration] and
/// returns a map from test-suite to a list of status-files.
Future<Map<String, Iterable<String>>> statusFileListerMap(
    Configuration configuration) {
  return statusFileListerMapFromArgs(configuration.toArgs());
}

/// Calls test.py with arguments [args] and returns a map from test-suite to a
/// list of status-files.
Future<Map<String, Iterable<String>>> statusFileListerMapFromArgs(
    List<String> args) async {
  args.add("--list-status-files");
  Map<String, List<String>> returnMap = {};
  var suitesWithStatusFiles = await callTestPy(args);
  String currentSuite = "";
  for (var line in suitesWithStatusFiles) {
    if (line.isEmpty) {
      continue;
    }
    bool isSuiteLine = !line.startsWith("\t");
    if (isSuiteLine) {
      currentSuite = line;
      returnMap[currentSuite] = [];
    }
    if (!isSuiteLine) {
      returnMap[currentSuite].add(line.trim());
    }
  }
  return returnMap;
}

/// Get tests for a suite.
Future<Iterable<String>> testsForSuite(String suite) async {
  Iterable<String> tests = await callTestPy(["--list", suite]);
  return tests
      .skip(3)
      .takeWhile((testName) => testName.isNotEmpty)
      .map((testInfo) {
    return testInfo.substring(0, testInfo.indexOf(" ")).trim();
  });
}
