#!/usr/bin/env python
# Copyright (c) 2018, 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 sys

import golem
import minify_tool
import toolhelper
import utils


def parse_arguments(argv):
  parser = argparse.ArgumentParser(
      description = 'Run r8 bootstrap benchmarks.')
  parser.add_argument('--golem',
      help = 'Link in third party dependencies.',
      default = False,
      action = 'store_true')
  return parser.parse_args(argv)


def dex(input, output):
  return_code = toolhelper.run(
      'd8', [
        input,
        '--output', output,
        '--lib', utils.RT_JAR,
        '--min-api', '10000',
        '--no-desugaring',
      ],
      debug=False,
      build=False)
  if return_code != 0:
    sys.exit(return_code)

if __name__ == '__main__':
  options = parse_arguments(sys.argv[1:])
  if options.golem:
    golem.link_third_party()
  with utils.TempDir() as temp:
    memory_file = os.path.join(temp, 'memory.dump')
    r8_output = os.path.join(temp, 'r8.zip')
    d8_r8_output = os.path.join(temp, 'd8r8.zip')
    d8_pg_output = os.path.join(temp, 'd8pg.zip')

    return_code = minify_tool.minify_tool(
      input_jar=utils.PINNED_R8_JAR,
      output_jar=r8_output,
      debug=False,
      build=False,
      track_memory_file=memory_file,
      benchmark_name="BootstrapR8")
    if return_code != 0:
      sys.exit(return_code)

    dex(r8_output, d8_r8_output)
    print "BootstrapR8(CodeSize):", utils.uncompressed_size(r8_output)
    print "BootstrapR8Dex(CodeSize):", utils.uncompressed_size(d8_r8_output)

    dex(utils.PINNED_PGR8_JAR, d8_pg_output)
    print "BootstrapR8PG(CodeSize):", utils.uncompressed_size(
        utils.PINNED_PGR8_JAR)
    print "BootstrapR8PGDex(CodeSize):", utils.uncompressed_size(d8_pg_output)

  sys.exit(0)
