#!/usr/bin/env python3
# Copyright 2022 The Chromium Authors
# 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 run a test apk using apk_operations.py."""

import argparse
import os
import string
import sys

from util import build_utils

SCRIPT_TEMPLATE = string.Template("""\
#!/usr/bin/env python3
#
# This file was generated by build/android/gyp/create_test_apk_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_APKS}]
  apk_operations.RunForTestApk(
      output_directory=resolve(${OUTPUT_DIR}),
      package_name=${PACKAGE_NAME},
      test_apk_path=resolve(${TEST_APK}),
      test_apk_json=resolve(${TEST_APK_JSON}),
      proguard_mapping_path=resolve(${MAPPING_PATH}),
      additional_apk_paths=additional_apk_paths)

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('--package-name', required=True)
  parser.add_argument('--test-apk')
  parser.add_argument('--test-apk-incremental-install-json')
  parser.add_argument('--proguard-mapping-path')
  parser.add_argument('--additional-apk',
                      action='append',
                      dest='additional_apks',
                      default=[],
                      help='Paths to APKs to be installed prior to --apk-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))

  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('.')),
        'PACKAGE_NAME': repr(args.package_name),
        'TEST_APK': repr(relativize(args.test_apk)),
        'TEST_APK_JSON':
        repr(relativize(args.test_apk_incremental_install_json)),
        'MAPPING_PATH': repr(relativize(args.proguard_mapping_path)),
        'ADDITIONAL_APKS': [relativize(p) for p in args.additional_apks],
    }
    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:]))
