#!/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)
  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 \\
  "$$@"
''')
  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())
