#!/usr/bin/env python3
# Copyright 2017 The Chromium Authors. 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 string
import sys

from util import build_utils

SCRIPT_TEMPLATE = string.Template("""\
#!/usr/bin/env python
#
# This file was generated by build/android/gyp/create_apk_operations_script.py

import os
import sys

def main():
  script_directory = os.path.dirname(__file__)
  resolve = lambda p: p if p is None else os.path.abspath(os.path.join(
      script_directory, p))
  sys.path.append(resolve(${APK_OPERATIONS_DIR}))
  import apk_operations
  output_dir = resolve(${OUTPUT_DIR})
  try:
    apk_operations.Run(
        output_dir,
        resolve(${APK_PATH}),
        [resolve(p) for p in ${ADDITIONAL_APK_PATHS}],
        resolve(${INC_JSON_PATH}),
        ${FLAGS_FILE},
        ${TARGET_CPU},
        resolve(${MAPPING_PATH}))
  except TypeError:
    rel_output_dir = os.path.relpath(output_dir)
    rel_script_path = os.path.relpath(sys.argv[0], output_dir)
    sys.stderr.write('Script out-of-date. Rebuild via:\\n')
    sys.stderr.write('  ninja -C %s %s\\n' % (rel_output_dir, rel_script_path))
    return 1


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


def main(args):
  args = build_utils.ExpandFileArgs(args)
  parser = argparse.ArgumentParser()
  parser.add_argument('--script-output-path',
                      help='Output path for executable script.')
  parser.add_argument('--apk-path')
  parser.add_argument('--incremental-install-json-path')
  parser.add_argument('--command-line-flags-file')
  parser.add_argument('--target-cpu')
  parser.add_argument(
      '--additional-apk-path',
      action='append',
      dest='additional_apk_paths',
      default=[],
      help='Paths to APKs to be installed prior to --apk-path.')
  parser.add_argument('--proguard-mapping-path')
  args = parser.parse_args(args)

  def relativize(path):
    """Returns the path relative to the output script directory."""
    if path is None:
      return path
    return os.path.relpath(path, os.path.dirname(args.script_output_path))
  apk_operations_dir = os.path.join(os.path.dirname(__file__), os.path.pardir)
  apk_operations_dir = relativize(apk_operations_dir)

  with open(args.script_output_path, 'w') as script:
    script_dict = {
        'APK_OPERATIONS_DIR': repr(apk_operations_dir),
        'OUTPUT_DIR': repr(relativize('.')),
        'APK_PATH': repr(relativize(args.apk_path)),
        'ADDITIONAL_APK_PATHS':
        [relativize(p) for p in args.additional_apk_paths],
        'INC_JSON_PATH': repr(relativize(args.incremental_install_json_path)),
        'MAPPING_PATH': repr(relativize(args.proguard_mapping_path)),
        'FLAGS_FILE': repr(args.command_line_flags_file),
        'TARGET_CPU': repr(args.target_cpu),
    }
    script.write(SCRIPT_TEMPLATE.substitute(script_dict))
  os.chmod(args.script_output_path, 0o750)
  return 0


if __name__ == '__main__':
  sys.exit(main(sys.argv[1:]))
