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

import 'package:args/args.dart' show ArgParser, ArgResults;
import 'package:vm/bytecode/ngrams.dart';

final ArgParser _argParser = new ArgParser(allowTrailingOptions: true)
  ..addFlag('basic-blocks',
      help: 'Only allow control flow as the last instruction in a window',
      defaultsTo: true)
  ..addOption('output',
      abbr: 'o', help: 'Path to output file', defaultsTo: null)
  ..addFlag('merge-pushes',
      help: 'Do not distinguish among different kinds of Push opcodes',
      defaultsTo: false)
  ..addFlag('sort',
      abbr: 's', help: 'Sort the output by ngram frequency', defaultsTo: true)
  ..addOption('threshold',
      abbr: 't', help: 'Minimum ngram count threshold', defaultsTo: "1")
  ..addOption('window', abbr: 'w', help: 'Window size', defaultsTo: "3");

final String _usage = '''
Usage: dump_bytecode_ngrams [options] input.trace

Dumps stats about a dynamic bytecode instruction trace produced with the
Dart VM option --interpreter-trace-file, e.g.:

\$ dart --enable-interpreter --interpreter-trace-file=trace program.dart

Options:
${_argParser.usage}
''';

const int _badUsageExitCode = 1;

void main(List<String> arguments) {
  final ArgResults options = _argParser.parse(arguments);
  if ((options.rest.length != 1) || (options['output'] == null)) {
    print(_usage);
    io.exit(_badUsageExitCode);
  }

  final basicBlocks = options['basic-blocks'];
  final input = options.rest.single;
  final output = options['output'];
  final mergePushes = options['merge-pushes'];
  final windowSize = int.parse(options['window']);
  final sort = options['sort'];
  final threshold = int.parse(options['threshold']);

  if (!(new io.File(input).existsSync())) {
    print("The file '$input' does not exist");
    print(_usage);
    io.exit(_badUsageExitCode);
  }

  NGramReader nGramReader = new NGramReader(input);
  nGramReader.readAllNGrams(windowSize,
      basicBlocks: basicBlocks, mergePushes: mergePushes);
  nGramReader.writeNGramStats(output, sort: sort, minCount: threshold);
}
