#!/usr/bin/env python
# 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, 0750)
  return 0


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