#!/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 gmscore_data
import optparse
import os
import sys
import toolhelper

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:
    toolhelper.run(
        'd8',
        args,
        build=not options.no_build,
        debug=not options.no_debug,
        profile=options.profile,
        track_memory_file=options.track_memory_to_file)

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