// 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 file.

import 'dart:async';
import 'dart:io';

import 'package:_fe_analyzer_shared/src/testing/annotated_code_helper.dart';
import 'package:args/args.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/dart2js.dart' as entry;
import 'package:expect/async_helper.dart';
import 'package:expect/expect.dart';
import 'package:sourcemap_testing/src/stepping_helper.dart';

import 'package:compiler/src/util/memory_compiler.dart';

void main(List<String> args) {
  ArgParser argParser = ArgParser(allowTrailingOptions: true);
  argParser.addFlag('debug', abbr: 'd', defaultsTo: false);
  argParser.addFlag('verbose', abbr: 'v', defaultsTo: false);
  argParser.addFlag('continued', abbr: 'c', defaultsTo: false);
  ArgResults argResults = argParser.parse(args);
  Directory dataDir = Directory.fromUri(Platform.script.resolve('stepping'));
  asyncTest(() async {
    bool continuing = false;
    await for (FileSystemEntity entity in dataDir.list()) {
      String name = entity.uri.pathSegments.last;
      if (argResults.rest.isNotEmpty &&
          !argResults.rest.contains(name) &&
          !continuing) {
        continue;
      }
      print('----------------------------------------------------------------');
      print('Checking ${entity.uri}');
      print('----------------------------------------------------------------');
      String annotatedCode = await File.fromUri(entity.uri).readAsString();
      await testAnnotatedCode(
        annotatedCode,
        verbose: argResults['verbose'],
        debug: argResults['debug'],
      );
      if (argResults['continued']) {
        continuing = true;
      }
    }
  });
}

const String kernelMarker = 'kernel.';

Future testAnnotatedCode(
  String code, {
  bool debug = false,
  bool verbose = false,
}) async {
  AnnotatedCode annotatedCode = AnnotatedCode.fromText(
    code,
    commentStart,
    commentEnd,
  );
  print(annotatedCode.sourceCode);
  Map<String, AnnotatedCode> split = splitByPrefixes(annotatedCode, [
    kernelMarker,
  ]);
  print('---from kernel------------------------------------------------------');
  await runTest(
    split[kernelMarker]!,
    kernelMarker,
    debug: debug,
    verbose: verbose,
  );
}

Future runTest(
  AnnotatedCode annotatedCode,
  String config, {
  bool debug = false,
  bool verbose = false,
  List<String> options = const <String>[],
}) async {
  Directory dir = Directory.systemTemp.createTempSync('stepping_test');
  String testFileName = 'test.dart';
  String path = dir.path;
  String inputFile = '$path/$testFileName';
  File(inputFile).writeAsStringSync(annotatedCode.sourceCode);
  String outputFile = '$path/js.js';
  List<String> arguments = <String>[
    '--out=$outputFile',
    inputFile,
    Flags.disableInlining,
    // Unsound platform dill files are no longer packaged in the SDK and must
    // be read from the build directory during tests.
    '--platform-binaries=$sdkPlatformBinariesPath',
    '--libraries-spec=$sdkLibrariesSpecificationUri',
  ];
  CompilationResult compilationResult = await entry.internalMain(arguments);
  Expect.isTrue(compilationResult.isSuccess);
  List<String> scriptD8Command = [
    '$sdkPath/_internal/js_runtime/lib/preambles/d8.js',
    outputFile,
  ];
  ProcessResult result = runD8AndStep(
    dir.path,
    testFileName,
    annotatedCode,
    scriptD8Command,
  );
  List<String> d8output = result.stdout.split("\n");
  if (verbose) {
    d8output.forEach(print);
  }
  checkD8Steps(dir.path, d8output, annotatedCode, debug: debug);
  dir.deleteSync(recursive: true);
}
