#!/usr/bin/env python
# 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 d8
import gmscore_data
import optparse
import os
import sys

def ParseOptions():
  result = optparse.OptionParser()
  result.add_option('--out',
                    help = '',
                    default = os.getcwd())
  result.add_option('--no-build',
                    help = '',
                    default = False,
                    action = 'store_true')
  result.add_option('--no-debug',
                    help = 'Run without debug asserts.',
                    default = False,
                    action = 'store_true')
  result.add_option('--version',
                    help = '',
                    default = 'v9',
                    choices = ['v9', 'v10', 'latest'])
  result.add_option('--type',
                    help = '',
                    default = 'proguarded',
                    choices = ['proguarded', 'deploy'])
  result.add_option('--d8-flags',
                    help = 'Additional option(s) for D8. ' +
                         'If passing several options use a quoted string.')
  result.add_option('--track-memory-to-file',
                    help = 'Track how much memory the jvm is using while ' +
                    ' compiling. Output to the specified file.')
  result.add_option('--profile',
                    help = 'Profile D8 run.',
                    default = False,
                    action = 'store_true')
  result.add_option('--dump-args-file',
                    help = 'Dump a file with the arguments for the specified ' +
                    'configuration. For use as a @<file> argument to perform ' +
                    'the run.')
  return result.parse_args()

def main():
  (options, args) = ParseOptions()
  outdir = options.out
  version = gmscore_data.VERSIONS[options.version]
  values = version[options.type]
  inputs = values['inputs']

  args.extend(['--output', outdir])

  if not os.path.exists(outdir):
    os.makedirs(outdir)

  if 'main-dex-list' in values:
    args.extend(['--main-dex-list', values['main-dex-list']])

  if options.d8_flags:
    args.extend(options.d8_flags.split(' '))

  args.extend(inputs)

  if options.dump_args_file:
    with open(options.dump_args_file, 'w') as args_file:
      args_file.writelines([arg + os.linesep for arg in args])
  else:
    d8.run(args, not options.no_build, not options.no_debug, options.profile,
           options.track_memory_to_file)

if __name__ == '__main__':
  sys.exit(main())
