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

// @dart = 2.9

import 'dart:io' show Platform, Process, ProcessResult;

import 'package:front_end/src/api_prototype/compiler_options.dart';

import 'package:kernel/ast.dart' as kernel show Version, defaultLanguageVersion;

import '../utils/io_utils.dart';

final String repoDir = computeRepoDir();

String get dartVm => Platform.executable;

void main(List<String> args) async {
  ProcessResult result = await Process.run(
      "python3", ["tools/make_version.py", "--no_git", "-q"],
      workingDirectory: repoDir);

  String stdout = result.stdout.toString();
  String stderr = result.stderr.toString();
  int exitCode = result.exitCode;

  print("--- stdout ---");
  print(stdout);
  print("--- stderr ---");
  print(stderr);
  print("---exit code ---");
  print(exitCode);

  // E.g. "2.6.0-edge" (without the quotes).
  String versionString = stdout.split("\n")[0];
  List<String> dotSeparatedParts = versionString.split(".");
  int major = int.tryParse(dotSeparatedParts[0]);
  int minor = int.tryParse(dotSeparatedParts[1]);
  kernel.Version version = new kernel.Version(major, minor);

  if (kernel.defaultLanguageVersion != version) {
    throw "Kernel defaults "
        "${kernel.defaultLanguageVersion}"
        " does not match output from make_version.py ($version)";
  } else {
    print("Kernel version matches.");
  }

  CompilerOptions compilerOptions = new CompilerOptions();

  List<String> dotSeparatedPartsFromOptions =
      compilerOptions.currentSdkVersion.split(".");
  int majorFromOptions = int.tryParse(dotSeparatedPartsFromOptions[0]);
  int minorFromOptions = int.tryParse(dotSeparatedPartsFromOptions[1]);
  if (majorFromOptions != major || minorFromOptions != minor) {
    throw "CompilerOptions defaults "
        "${majorFromOptions}.${minorFromOptions}"
        " does not match output from make_version.py ($major.$minor)";
  } else {
    print("CompilerOptions default version matches.");
  }
}
