#!/usr/bin/env python
# Copyright 2017 The Fuchsia 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 stat
import string
import sys

def main():
  parser = argparse.ArgumentParser(
      description='Generate a script that invokes a Dart application')
  parser.add_argument('--out',
                      help='Path to the invocation file to generate',
                      required=True)
  parser.add_argument('--dart',
                      help='Path to the Dart binary',
                      required=True)
  parser.add_argument('--snapshot',
                      help='Path to the app snapshot',
                      required=True)
  args = parser.parse_args()

  app_file = args.out
  app_path = os.path.dirname(app_file)
  if not os.path.exists(app_path):
    os.makedirs(app_path)

  script_template = string.Template('''#!/bin/sh

$dart \\
  $snapshot \\
  "$$@"
''')
  with open(app_file, 'w') as file:
    file.write(script_template.substitute(args.__dict__))
  permissions = (stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR |
                 stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP |
                 stat.S_IROTH)
  os.chmod(app_file, permissions)


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