#!/usr/bin/env python3
# Copyright 2018 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.

"""Create a wrapper script to manage an Android App Bundle."""

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_bundle_wrapper_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(${WRAPPED_SCRIPT_DIR}))
  import apk_operations

  additional_apk_paths = [resolve(p) for p in ${ADDITIONAL_APK_PATHS}]
  apk_operations.RunForBundle(output_directory=resolve(${OUTPUT_DIR}),
                              bundle_path=resolve(${BUNDLE_PATH}),
                              bundle_apks_path=resolve(${BUNDLE_APKS_PATH}),
                              additional_apk_paths=additional_apk_paths,
                              aapt2_path=resolve(${AAPT2_PATH}),
                              keystore_path=resolve(${KEYSTORE_PATH}),
                              keystore_password=${KEYSTORE_PASSWORD},
                              keystore_alias=${KEY_NAME},
                              package_name=${PACKAGE_NAME},
                              command_line_flags_file=${FLAGS_FILE},
                              proguard_mapping_path=resolve(${MAPPING_PATH}),
                              target_cpu=${TARGET_CPU},
                              system_image_locales=${SYSTEM_IMAGE_LOCALES},
                              default_modules=${DEFAULT_MODULES})

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

def main(args):
  args = build_utils.ExpandFileArgs(args)
  parser = argparse.ArgumentParser()
  parser.add_argument('--script-output-path', required=True,
                      help='Output path for executable script.')
  parser.add_argument('--bundle-path', required=True)
  parser.add_argument('--bundle-apks-path', required=True)
  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('--package-name', required=True)
  parser.add_argument('--aapt2-path', required=True)
  parser.add_argument('--keystore-path', required=True)
  parser.add_argument('--keystore-password', required=True)
  parser.add_argument('--key-name', required=True)
  parser.add_argument('--command-line-flags-file')
  parser.add_argument('--proguard-mapping-path')
  parser.add_argument('--target-cpu')
  parser.add_argument('--system-image-locales')
  parser.add_argument('--default-modules', nargs='*', default=[])
  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))

  wrapped_script_dir = os.path.join(os.path.dirname(__file__), os.path.pardir)
  wrapped_script_dir = relativize(wrapped_script_dir)
  with open(args.script_output_path, 'w') as script:
    script_dict = {
        'WRAPPED_SCRIPT_DIR':
        repr(wrapped_script_dir),
        'OUTPUT_DIR':
        repr(relativize('.')),
        'BUNDLE_PATH':
        repr(relativize(args.bundle_path)),
        'BUNDLE_APKS_PATH':
        repr(relativize(args.bundle_apks_path)),
        'ADDITIONAL_APK_PATHS':
        [relativize(p) for p in args.additional_apk_paths],
        'PACKAGE_NAME':
        repr(args.package_name),
        'AAPT2_PATH':
        repr(relativize(args.aapt2_path)),
        'KEYSTORE_PATH':
        repr(relativize(args.keystore_path)),
        'KEYSTORE_PASSWORD':
        repr(args.keystore_password),
        'KEY_NAME':
        repr(args.key_name),
        'MAPPING_PATH':
        repr(relativize(args.proguard_mapping_path)),
        'FLAGS_FILE':
        repr(args.command_line_flags_file),
        'TARGET_CPU':
        repr(args.target_cpu),
        'SYSTEM_IMAGE_LOCALES':
        repr(build_utils.ParseGnList(args.system_image_locales)),
        'DEFAULT_MODULES':
        repr(args.default_modules),
    }
    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:]))
