#!/usr/bin/env python2.7
# 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())
