#!/usr/bin/env dart
// Copyright (c) 2016, 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.

@JS()
library dev_compiler.web.main;

import 'dart:async';

import 'package:args/command_runner.dart';
import 'package:js/js.dart';

import 'web_command.dart';

@JS(r'$setUpDartDevCompilerInBrowser')
external set setUpCompilerInBrowser(Function function);

Future<dynamic> _setUpCompilerInBrowser;
main() {
  var args = ['compile'];

  // Avoid race condition when users try to call $setUpDartDevCompilerInBrowser
  // before it is ready by installing the method immediately and making the body
  // of the method async.
  setUpCompilerInBrowser = allowInterop((String sdkUrl,
      JSMap<String, String> summaryMap,
      Function onCompileReady,
      Function onError,
      [Function onProgress]) async {
    (await _setUpCompilerInBrowser)(
        sdkUrl, summaryMap, onCompileReady, onError, onProgress);
  });
  _runCommand(args);
}

/// Runs a single compile command, and returns an exit code.
_runCommand(List<String> args, {MessageHandler messageHandler}) {
  try {
    // TODO: Remove CommandRunner and args if possible. May run into issues
    // with ArgResults or ArgParsers.
    var runner = CommandRunner('dartdevc', 'Dart Development Compiler');
    runner.addCommand(WebCompileCommand(messageHandler: messageHandler));
    _setUpCompilerInBrowser = runner.run(args);
  } catch (e, s) {
    _handleError(e, s, args, messageHandler: messageHandler);
  }
}

/// Handles [error] in a uniform fashion. Calls [messageHandler] with messages.
_handleError(dynamic error, dynamic stackTrace, List<String> args,
    {MessageHandler messageHandler}) {
  messageHandler ??= print;

  if (error is UsageException) {
    // Incorrect usage, input file not found, etc.
    messageHandler(error);
  } else if (error is CompileErrorException) {
    // Code has error(s) and failed to compile.
    messageHandler(error);
  } else {
    // Anything else is likely a compiler bug.
    //
    // --unsafe-force-compile is a bit of a grey area, but it's nice not to
    // crash while compiling
    // (of course, output code may crash, if it had errors).
    //
    messageHandler("");
    messageHandler("We're sorry, you've found a bug in our compiler.");
    messageHandler("You can report this bug at:");
    messageHandler(
        "    https://github.com/dart-lang/sdk/issues/labels/area-dev-compiler");
    messageHandler("");
    messageHandler(
        "Please include the information below in your report, along with");
    messageHandler(
        "any other information that may help us track it down. Thanks!");
    messageHandler("");
    messageHandler("    dartdevc arguments: " + args.join(' '));
    messageHandler("");
    messageHandler("```");
    messageHandler(error);
    messageHandler(stackTrace);
    messageHandler("```");
  }
}
