// Copyright (c) 2017, 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.

/// Helper to run fasta with the right target configuration to build dart2js
/// applications using the dart2js platform libraries.
// TODO(sigmund): delete this file once we can configure fasta directly on the
// command line.
library compiler.tool.generate_kernel;

import 'dart:io';

import 'package:args/args.dart';
import 'package:compiler/src/kernel/dart2js_target.dart';
import 'package:compiler/src/filenames.dart';
import 'package:front_end/src/api_prototype/front_end.dart';
import 'package:front_end/src/compute_platform_binaries_location.dart'
    show computePlatformBinariesLocation;
import 'package:front_end/src/fasta/util/relativize.dart';
import 'package:kernel/kernel.dart';
import 'package:kernel/target/targets.dart';

main(List<String> args) async {
  ArgResults flags = _argParser.parse(args);
  var options = new CompilerOptions()
    ..target = new Dart2jsTarget(new TargetFlags())
    ..packagesFileUri = Uri.base.resolve('.packages')
    ..setExitCodeOnProblem = true
    ..linkedDependencies = [
      Uri.base.resolve(nativeToUriPath(flags['platform']))
    ];

  if (flags.rest.isEmpty) {
    var script = relativizeUri(Platform.script);
    var platform =
        relativizeUri(Uri.base.resolve(nativeToUriPath(flags['platform'])));
    print('usage: ${Platform.executable} $script '
        '[--platform=$platform] [--out=out.dill] program.dart');
    exit(1);
  }

  Uri entry = Uri.base.resolve(nativeToUriPath(flags.rest.first));
  var component = await kernelForProgram(entry, options);
  await writeComponentToBinary(component, flags['out']);
}

ArgParser _argParser = new ArgParser()
  ..addOption('platform',
      help: 'location of the precompiled dart2js sdk',
      defaultsTo: _defaultPlatform)
  ..addOption('out',
      abbr: 'o', help: 'output location', defaultsTo: 'out.dill');

String _defaultPlatform = computePlatformBinariesLocation()
    .resolve('dart2js_platform.dill')
    .toFilePath();
