// Copyright 2013 The Flutter 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:file/file.dart';

import 'common/package_looping_command.dart';
import 'common/pub_utils.dart';
import 'common/repository_package.dart';

const String _scriptName = 'run_tests.dart';
const String _legacyScriptName = 'run_tests.sh';

/// A command to run custom, package-local tests on packages.
///
/// This is an escape hatch for adding tests that this tooling doesn't support.
/// It should be used sparingly; prefer instead to add functionality to this
/// tooling to eliminate the need for bespoke tests.
class CustomTestCommand extends PackageLoopingCommand {
  /// Creates a custom test command instance.
  CustomTestCommand(
    super.packagesDir, {
    super.processRunner,
    super.platform,
  });

  @override
  final String name = 'custom-test';

  @override
  List<String> get aliases => <String>['test-custom'];

  @override
  final String description = 'Runs package-specific custom tests defined in '
      "a package's tool/$_scriptName file.\n\n"
      'This command requires "dart" to be in your path.';

  @override
  Future<PackageResult> runForPackage(RepositoryPackage package) async {
    final File script =
        package.directory.childDirectory('tool').childFile(_scriptName);
    final File legacyScript = package.directory.childFile(_legacyScriptName);
    String? customSkipReason;
    bool ranTests = false;

    // Run the custom Dart script if presest.
    if (script.existsSync()) {
      // Ensure that dependencies are available.
      if (!await runPubGet(package, processRunner, platform)) {
        return PackageResult.fail(
            <String>['Unable to get script dependencies']);
      }

      final int testExitCode = await processRunner.runAndStream(
          'dart', <String>['run', 'tool/$_scriptName'],
          workingDir: package.directory);
      if (testExitCode != 0) {
        return PackageResult.fail();
      }
      ranTests = true;
    }

    // Run the legacy script if present.
    if (legacyScript.existsSync()) {
      if (platform.isWindows) {
        customSkipReason = '$_legacyScriptName is not supported on Windows. '
            'Please migrate to $_scriptName.';
      } else {
        final int exitCode = await processRunner.runAndStream(
            legacyScript.path, <String>[],
            workingDir: package.directory);
        if (exitCode != 0) {
          return PackageResult.fail();
        }
        ranTests = true;
      }
    }

    if (!ranTests) {
      return PackageResult.skip(customSkipReason ?? 'No custom tests');
    }

    return PackageResult.success();
  }
}
