#!/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())
