#!/usr/bin/env python
# Copyright 2019 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('--wd',
                      help='Path to the working directory, relative to that of the script',
                      required=True)
  parser.add_argument('--out',
                      help='Path to the invocation file to generate',
                      required=True)
  parser.add_argument('--dart',
                      help='Path to the Dart binary, relative to the working directory',
                      required=True)
  parser.add_argument('--snapshot',
                      help='Path to the binary snapshot, relative to the working directory',
                      required=True)
  parser.add_argument('--args',
                      help='Command-line arguments to prepend to those passed to the script',
                      required=False,
                      default='')
  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
# DO NOT EDIT
# This script is generated by:
#   //topaz/runtime/dart/gen_dart_test_invocation.py

cd "$$(dirname $$0)/$wd"

$dart \\
  $snapshot \\
  $args \\
  "$$@"
''')
  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())
