// Copyright (c) 2019, 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' show Directory, File, Platform, Process, ProcessResult;

import 'dart:typed_data' show Uint8List;

import 'package:front_end/src/fasta/kernel/utils.dart' show serializeComponent;

import 'package:kernel/ast.dart' show Component, Library;

import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;

import 'package:kernel/target/targets.dart' show TargetFlags;

import "package:vm/target/vm.dart" show VmTarget;

import 'incremental_load_from_dill_suite.dart'
    show getOptions, normalCompileToComponent;

import 'utils/io_utils.dart' show computeRepoDir;

main() async {
  final Uri dart2jsUrl = Uri.base.resolve("pkg/compiler/bin/dart2js.dart");
  Stopwatch stopwatch = new Stopwatch()..start();
  Component component = await normalCompileToComponent(dart2jsUrl,
      options: getOptions()
        ..target = new VmTarget(new TargetFlags())
        ..omitPlatform = false);
  print("Compiled dart2js in ${stopwatch.elapsedMilliseconds} ms");

  component.computeCanonicalNames();

  stopwatch.reset();
  List<List<int>> libComponents = new List<List<int>>();
  for (Library lib in component.libraries) {
    Component libComponent = new Component(nameRoot: component.root);
    libComponent.libraries.add(lib);
    libComponent.uriToSource.addAll(component.uriToSource);
    libComponent.setMainMethodAndMode(
        component.mainMethodName, true, component.mode);
    libComponents.add(serializeComponent(libComponent));
  }
  print("Serialized ${libComponents.length} separate library components "
      "in ${stopwatch.elapsedMilliseconds} ms");

  stopwatch.reset();
  int totalLength = 0;
  for (List<int> libComponent in libComponents) {
    totalLength += libComponent.length;
  }
  Uint8List combined = new Uint8List(totalLength);
  int index = 0;
  for (List<int> libComponent in libComponents) {
    combined.setRange(index, index + libComponent.length, libComponent);
    index += libComponent.length;
  }
  print("Combined in ${stopwatch.elapsedMilliseconds} ms");

  stopwatch.reset();
  Component combinedComponent = new Component();
  new BinaryBuilder(combined).readComponent(combinedComponent);
  print("Read combined in ${stopwatch.elapsedMilliseconds} ms");

  stopwatch.reset();
  Uint8List merged = serializeComponent(combinedComponent);
  print("Serialized combined component in ${stopwatch.elapsedMilliseconds} ms");

  for (Uint8List data in [combined, merged]) {
    stopwatch.reset();
    Directory out = Directory.systemTemp.createTempSync("split_dill_test");
    try {
      File f = new File.fromUri(out.uri.resolve("out.dill"));
      f.writeAsBytesSync(data);

      ProcessResult result = await Process.run(
          dartVm,
          [
            "--compile_all",
            f.path,
            "-h",
          ],
          workingDirectory: out.path);
      print("stdout: ${result.stdout}");
      print("stderr: ${result.stderr}");
      print("Exit code: ${result.exitCode}");
      if (result.exitCode != 0) {
        throw "Got exit code ${result.exitCode}";
      }
      print("Ran VM on dill in ${stopwatch.elapsedMilliseconds} ms");
    } finally {
      out.deleteSync(recursive: true);
    }
  }
}

final String repoDir = computeRepoDir();

String get dartVm => Platform.resolvedExecutable;
