// Copyright (c) 2024, 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:io';

import '../tool/entry_points.dart' show compilePlatformEntryPoint;
import 'coverage_helper.dart';

Future<void> main(List<String> arguments) async {
  Uri? coverageUri;
  for (String argument in arguments) {
    if (argument.startsWith("--coverage=")) {
      coverageUri = Uri.base
          .resolveUri(Uri.file(argument.substring("--coverage=".length)));
    } else {
      throw "Unsupported argument: $argument";
    }
  }
  if (coverageUri == null) {
    throw "Need --coverage=<dir>/ argument";
  }

  Directory tmp =
      Directory.systemTemp.createTempSync("compile_platform_coverage");
  String outlinePath = tmp.uri.resolve("vm_outline_strong.dill").toFilePath();
  String platformPath = tmp.uri.resolve("vm_platform_strong.dill").toFilePath();

  await compilePlatformEntryPoint([
    "dart:core",
    "-Ddart.vm.product=false",
    "-Ddart.isVM=true",
    "--single-root-scheme=org-dartlang-sdk",
    "--single-root-base=.",
    "org-dartlang-sdk:///sdk/lib/libraries.json",
    outlinePath,
    platformPath,
    outlinePath,
  ]);

  tmp.deleteSync(recursive: true);

  const String displayName = "compile platform";
  File f = new File.fromUri(coverageUri.resolve("$displayName.coverage"));
  // Force compiling seems to add something like 1 second to the collection
  // time, but we get rid of uncompiled functions so it seems to be worth it.
  (await collectCoverage(displayName: displayName, forceCompile: true))
      ?.writeToFile(f);
}
