#!/usr/bin/env python
# Copyright (c) 2020, 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 argparse
import os
import subprocess
import sys
import time

import golem
import jdk
import proguard
import utils

GOLEM_BUILD_TARGETS = ['R8Lib']
RETRACERS = ['r8', 'proguard', 'remapper']

def parse_arguments(argv):
  parser = argparse.ArgumentParser(
                    description = 'Run r8 retrace bootstrap benchmarks.')
  parser.add_argument('--golem',
                    help = 'Link in third party dependencies.',
                    default = False,
                    action = 'store_true')
  parser.add_argument('--ignore-java-version',
                    help='Do not check java version',
                    default=False,
                    action='store_true')
  parser.add_argument('--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_argument('--retracer',
                    help='The retracer to use',
                    choices=RETRACERS,
                    required=True)
  parser.add_argument('--download-benchmarks',
                      help='Download retrace benchmarks',
                      default=False,
                      action='store_true')
  options = parser.parse_args(argv)
  return options

def download_benchmarks():
  utils.DownloadFromGoogleCloudStorage(
      os.path.join(utils.THIRD_PARTY, 'retrace_benchmark') + '.tar.gz.sha1')

def run_retrace(options, temp):
  if options.download_benchmarks:
    download_benchmarks()
  if options.retracer == 'r8':
    retracer_args = [
        '-cp', utils.R8LIB_JAR, 'com.android.tools.r8.retrace.Retrace']
  elif options.retracer == 'proguard':
    retracer_args = ['-jar', proguard.getRetraceJar()]
  elif options.retracer == 'remapper':
    retracer_args = ['-jar',
                     os.path.join(
                        utils.THIRD_PARTY,
                        'remapper',
                        'remapper_deploy.jar')]
  else:
    assert False, "Unexpected retracer " + options.retracer
  retrace_args = [jdk.GetJavaExecutable()] + retracer_args + [
    os.path.join(utils.THIRD_PARTY, 'retrace_benchmark', 'r8lib.jar.map'),
    os.path.join(utils.THIRD_PARTY, 'retrace_benchmark', 'stacktrace.txt')]
  utils.PrintCmd(retrace_args)
  t0 = time.time()
  subprocess.check_call(retrace_args)
  t1 = time.time()
  if options.print_runtimeraw:
    print('{}(RunTimeRaw): {} ms'
        .format(options.print_runtimeraw, 1000.0 * (t1 - t0)))


if __name__ == '__main__':
  options = parse_arguments(sys.argv[1:])
  if options.golem:
    golem.link_third_party()
  if not options.ignore_java_version:
    utils.check_java_version()
  with utils.TempDir() as temp:
    run_retrace(options, temp)
