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

import optparse
import sys
import toolhelper


def ParseOptions(argv):
    parser = optparse.OptionParser(usage='%prog [options] -- [D8 options]')
    parser.add_option('-c',
                      '--commit-hash',
                      '--commit_hash',
                      help='Commit hash of D8 to use.',
                      default=None)
    parser.add_option('--debug-agent',
                      '--debug_agent',
                      help='Enable Java debug agent and suspend compilation',
                      default=False,
                      action='store_true')
    parser.add_option('--disable-assertions',
                      '--disable_assertions',
                      help='Disable assertions when running',
                      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('--no-build',
                      '--no_build',
                      help='Do not build D8',
                      default=False,
                      action='store_true')
    parser.add_option('--version', help='Version of D8 to use.', default=None)
    parser.add_option('--tag', help='Tag of D8 to use.', default=None)
    return parser.parse_args(argv)


def main(argv):
    (options, args) = ParseOptions(sys.argv)
    d8_args = args[1:]
    time_consumer = lambda duration: print_duration(duration, options)
    return toolhelper.run('d8',
                          d8_args,
                          build=not options.no_build,
                          debug_agent=options.debug_agent,
                          disable_assertions=options.disable_assertions,
                          jar=utils.find_r8_jar_from_options(options),
                          main='com.android.tools.r8.D8',
                          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:]))
