#!/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;
void 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("```");
  }
}
