#!/usr/bin/env python3
# Copyright (c) 2017, the R8 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 optparse
import sys

import toolhelper
import utils

def ParseOptions(argv):
  parser = optparse.OptionParser(usage='%prog [options] -- [R8 options]')
  parser.add_option(
      '-c',
      '--commit-hash',
      '--commit_hash',
      help='Commit hash of R8 to use.',
      default=None)
  parser.add_option(
      '--debug-agent',
      help='Enable Java debug agent and suspend compilation (default disabled)',
      default=False,
      action='store_true')
  parser.add_option(
    '--ea',
    help='Enable Java assertions when running the compiler (default disabled)',
    default=False,
    action='store_true')
  parser.add_option(
    '--lib-android',
    help='Add the android.jar for the given API level',
    default=None,
    type=int)
  parser.add_option(
    '--lib-rt',
    help='Add rt.jar from openjdk-1.8',
    default=False,
    action='store_true')
  parser.add_option(
    '--no-build', '--no_build',
    help='Do not build R8',
    default=False,
    action='store_true')
  parser.add_option(
    '--print-runtimeraw', '--print_runtimeraw',
    metavar='BENCHMARKNAME',
    help='Print the line \'<BENCHMARKNAME>(RunTimeRaw):' +
         ' <elapsed> ms\' at the end where <elapsed> is' +
         ' the elapsed time in milliseconds.')
  parser.add_option(
      '--tag',
      help='Tag of R8 to use.',
      default=None)
  parser.add_option(
      '--version',
      help='Version of R8 to use.',
      default=None)
  return parser.parse_args(argv)

def main(argv):
  (options, args) = ParseOptions(sys.argv)
  r8_args = args[1:]
  if options.lib_android:
    r8_args.extend(['--lib', utils.get_android_jar(options.lib_android)])
  if options.lib_rt:
    r8_args.extend(['--lib', utils.RT_JAR])
  time_consumer = lambda duration : print_duration(duration, options)
  return toolhelper.run(
      'r8',
      r8_args,
      build=not options.no_build,
      debug=options.ea,
      debug_agent=options.debug_agent,
      jar=utils.find_r8_jar_from_options(options),
      main='com.android.tools.r8.R8',
      time_consumer=time_consumer)

def print_duration(duration, options):
  benchmark_name = options.print_runtimeraw
  if benchmark_name:
    print('%s-Total(RunTimeRaw): %s ms' % (benchmark_name, duration))

if __name__ == '__main__':
  sys.exit(main(sys.argv[1:]))
