// Copyright (c) 2016, 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.md file.

library testing.discover;

import 'dart:io' show Directory, FileSystemEntity, Platform, Process;

import 'dart:async' show Future, Stream, StreamController, StreamSubscription;

import '../testing.dart' show FileBasedTestDescription;

final Uri packageConfig = computePackageConfig();

final Uri dartSdk = computeDartSdk();

/// Common arguments when running a dart program. Returns a copy that can
/// safely be modified by caller.
List<String> get dartArguments =>
    <String>["-c", "--packages=${packageConfig.toFilePath()}"];

Stream<FileBasedTestDescription> listTests(List<Uri> testRoots,
    {Pattern? pattern}) {
  StreamController<FileBasedTestDescription> controller =
      StreamController<FileBasedTestDescription>();
  Map<Uri, StreamSubscription?> subscriptions = <Uri, StreamSubscription>{};
  for (Uri testRootUri in testRoots) {
    subscriptions[testRootUri] = null;
    Directory testRoot = Directory.fromUri(testRootUri);
    testRoot.exists().then((bool exists) {
      if (exists) {
        Stream<FileSystemEntity> stream =
            testRoot.list(recursive: true, followLinks: false);
        var subscription = stream.listen((FileSystemEntity entity) {
          FileBasedTestDescription? description = FileBasedTestDescription.from(
              testRootUri, entity,
              pattern: pattern);
          if (description != null) {
            controller.add(description);
          }
        }, onError: (error, StackTrace trace) {
          controller.addError(error, trace);
        }, onDone: () {
          subscriptions.remove(testRootUri);
          if (subscriptions.isEmpty) {
            controller.close(); // TODO(ahe): catchError???
          }
        });
        subscriptions[testRootUri] = subscription;
      } else {
        controller.addError("$testRootUri isn't a directory");
        subscriptions.remove(testRootUri);
      }
      if (subscriptions.isEmpty) {
        controller.close(); // TODO(ahe): catchError???
      }
    });
  }
  return controller.stream;
}

Uri computePackageConfig() {
  String? path = Platform.packageConfig;
  if (path != null) return Uri.base.resolve(path);
  return Uri.base.resolve(".dart_tool/package_config.json");
}

// TODO(eernst): Use `bool.hasEnvironment` below when possible;
// for now we use a dual `defaultValue` rewrite.
const _dartSdk = (String.fromEnvironment("DART_SDK", defaultValue: "1") ==
        String.fromEnvironment("DART_SDK", defaultValue: "2"))
    ? String.fromEnvironment("DART_SDK")
    : null;

Uri computeDartSdk() {
  String? dartSdkPath = Platform.environment["DART_SDK"] ?? _dartSdk;
  if (dartSdkPath != null) {
    return Uri.base.resolveUri(Uri.file(dartSdkPath));
  } else {
    return Uri.base
        .resolveUri(Uri.file(Platform.resolvedExecutable))
        .resolve("../");
  }
}

Future<Process> startDart(Uri program,
    [List<String>? arguments, List<String>? vmArguments]) {
  List<String> allArguments = <String>[];
  allArguments.addAll(vmArguments ?? dartArguments);
  allArguments.add(program.toFilePath());
  if (arguments != null) {
    allArguments.addAll(arguments);
  }
  return Process.start(Platform.resolvedExecutable, allArguments);
}
