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

Future<String> getVersion(var options, var rootPath) {
  var os = Platform.operatingSystem;
  var suffix = os == 'windows' ? '.exe' : '';
  var checkedInBinary =
      rootPath.join(new Path('tools/testing/bin/$os/dart$suffix'));
  var versionPath = rootPath.append("tools").append("version.dart");
  return Process.run(checkedInBinary.toNativePath(),
                     [versionPath.toNativePath()])
      .then((result) {
        if (result.exitCode != 0) {
          throw "Could not generate version";
        }
        return result.stdout.trim();
      });
}

Future<String> getSnapshotGenerationFile(var options, var args, var rootPath) {
  var dart2js = rootPath.append(args["dart2js_main"]);
  var dartdoc = rootPath.append(args["dartdoc_main"]);

  return getVersion(options, rootPath).then((version) {
    var snapshotGenerationText =
"""
import '${dart2js}' as dart2jsMain;
import '${dartdoc}' as dartdocMain;
import 'dart:io';

void main() {
  Options options = new Options();
  if (options.arguments.length < 1) throw "No tool given as argument";
  String tool = options.arguments.removeAt(0);
  if (tool == "dart2js") {
    dart2jsMain.BUILD_ID = "$version";
    dart2jsMain.mainWithErrorHandler(options);
  } else if (tool == "dartdoc") {
    dartdocMain.mainWithOptions(options);
  }
}

""";
    return snapshotGenerationText;
  });
}

void writeSnapshotFile(var path, var content) {
    File file = new File(path);
    var writer = file.openSync(mode: FileMode.WRITE);
    writer.writeStringSync(content);
    writer.close();
}

Future createSnapshot(var options, var dart_file, var packageRoot) {
  return Process.run(options.executable,
                     ["--package-root=$packageRoot",
                      "--snapshot=$dart_file.snapshot",
                      dart_file])
      .then((result) {
        if (result.exitCode != 0) {
          throw "Could not generate snapshot";
        }
      });
}

/**
 * Takes the following arguments:
 * --output_dir=val     The full path to the output_dir.
 * --dart2js_main=val   The path to the dart2js main script releative to root.
 */
void main() {
  Options options = new Options();
  var validArguments = ["--output_dir", "--dart2js_main", "--dartdoc_main",
                        "--package_root"];
  var args = {};
  for (var argument in options.arguments) {
    var argumentSplit = argument.split("=");
    if (argumentSplit.length != 2) throw "Invalid argument $argument, no =";
    if (!validArguments.contains(argumentSplit[0])) {
      throw "Invalid argument $argument";
    }
    args[argumentSplit[0].substring(2)] = argumentSplit[1];
  }
  if (!args.containsKey("dart2js_main")) throw "Please specify dart2js_main";
  if (!args.containsKey("dartdoc_main")) throw "Please specify dartdoc_main";
  if (!args.containsKey("output_dir")) throw "Please specify output_dir";
  if (!args.containsKey("package_root")) throw "Please specify package_root";

  var scriptFile = new File(new File(options.script).fullPathSync());
  var path = new Path(scriptFile.directory.path);
  var rootPath = path.directoryPath.directoryPath;
  getSnapshotGenerationFile(options, args, rootPath).then((result) {
    var wrapper = "${args['output_dir']}/utils_wrapper.dart";
    writeSnapshotFile(wrapper, result);
    createSnapshot(options, wrapper, args["package_root"]);
  });
}
