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

/// Command line entry point for Dart Development Compiler (dartdevc), used to
/// compile a collection of dart libraries into a single JS module

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:analyzer/file_system/physical_file_system.dart';
import 'package:analyzer/src/command_line/arguments.dart';
import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
import 'package:bazel_worker/bazel_worker.dart';
import 'package:dev_compiler/src/analyzer/command.dart';

Future main(List<String> args) async {
  // Always returns a new modifiable list.
  args = preprocessArgs(PhysicalResourceProvider.INSTANCE, args);

  if (args.contains('--persistent_worker')) {
    await _CompilerWorker(args..remove('--persistent_worker')).run();
  } else if (args.isNotEmpty && args.last == "--batch") {
    await runBatch(args.sublist(0, args.length - 1));
  } else {
    exitCode = compile(args);
  }
}

/// Runs the compiler worker loop.
class _CompilerWorker extends AsyncWorkerLoop {
  /// The original args supplied to the executable.
  final List<String> _startupArgs;

  _CompilerWorker(this._startupArgs) : super();

  /// Performs each individual work request.
  Future<WorkResponse> performRequest(WorkRequest request) async {
    var args = _startupArgs.toList()..addAll(request.arguments);

    var output = StringBuffer();
    var exitCode = compile(args, printFn: output.writeln);
    AnalysisEngine.instance.clearCaches();
    return WorkResponse()
      ..exitCode = exitCode
      ..output = output.toString();
  }
}

runBatch(List<String> batchArgs) async {
  int totalTests = 0;
  int testsFailed = 0;
  var watch = Stopwatch()..start();
  print('>>> BATCH START');
  String line;
  while ((line = stdin.readLineSync(encoding: utf8)).isNotEmpty) {
    totalTests++;
    var args = batchArgs.toList()..addAll(line.split(RegExp(r'\s+')));

    // We don't try/catch here, since `compile` should handle that.
    var compileExitCode = compile(args);
    AnalysisEngine.instance.clearCaches();
    stderr.writeln('>>> EOF STDERR');
    var outcome = compileExitCode == 0
        ? 'PASS'
        : compileExitCode == 70 ? 'CRASH' : 'FAIL';
    print('>>> TEST $outcome ${watch.elapsedMilliseconds}ms');
  }
  int time = watch.elapsedMilliseconds;
  print('>>> BATCH END '
      '(${totalTests - testsFailed})/$totalTests ${time}ms');
}
