#!/usr/bin/env python3
#
# Copyright 2013 The Flutter 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 subprocess
import os
import sys


def main():
  parser = argparse.ArgumentParser(description='Package a Flutter application')

  parser.add_argument(
      '--flutter-root',
      type=str,
      required=True,
      help='The root of the Flutter SDK'
  )
  parser.add_argument(
      '--flutter-tools',
      type=str,
      required=True,
      help='The executable for the Flutter tool'
  )
  parser.add_argument(
      '--asset-dir',
      type=str,
      required=True,
      help='The directory where to put intermediate files'
  )
  parser.add_argument(
      '--app-dir', type=str, required=True, help='The root of the app'
  )
  parser.add_argument(
      '--packages', type=str, required=True, help='The package map to use'
  )
  parser.add_argument('--manifest', type=str, help='The application manifest')
  parser.add_argument(
      '--component-name', type=str, help='The name of the component'
  )
  parser.add_argument(
      '--asset-manifest-out',
      type=str,
      help='Output path for the asset manifest used by the fuchsia packaging tool'
  )

  args = parser.parse_args()

  env = os.environ.copy()
  env['FLUTTER_ROOT'] = args.flutter_root

  call_args = [
      args.flutter_tools,
      '--asset-dir=%s' % args.asset_dir,
      '--packages=%s' % args.packages,
  ]
  if 'manifest' in args:
    call_args.append('--manifest=%s' % args.manifest)

  if args.asset_manifest_out:
    call_args.append('--asset-manifest-out=%s' % args.asset_manifest_out)

  if args.component_name:
    call_args.append('--component-name=%s' % args.component_name)

  result = subprocess.call(call_args, env=env, cwd=args.app_dir)

  return result


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