#!/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 the Dart tester')
    parser.add_argument(
        '--wd',
        help=
        'Path to the working directory, relative to that of the invocation file',
        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 snapshot of the the test runner, relative to the working directory',
        required=True)
    parser.add_argument(
        '--sdk-root',
        help='Path to the SDK platform files, relative to the working directory',
        required=True)
    parser.add_argument(
        '--tests',
        help=
        'Path to test-to-precompiled-kernel file list, relative to the working directory',
        required=True)
    parser.add_argument(
        '--dot-packages',
        help='Path to the .packages file, relative to the working directory',
        required=True)
    parser.add_argument(
        '--flutter-shell',
        help='Path to the Flutter shell, relative to the working directory',
        required=True)
    parser.add_argument(
        '--icudtl',
        help='Path to the ICU data file, relative to the working directory',
        required=True)
    args = parser.parse_args()

    test_file = args.out
    test_path = os.path.dirname(test_file)
    if not os.path.exists(test_path):
        os.makedirs(test_path)

    script_template = string.Template(
        '''#!/bin/bash
# DO NOT EDIT
# This script is generated by:
#   //build/flutter/internal/gen_flutter_test_invocation.py
# See: //build/flutter/test.gni

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

$dart --verbosity=warning $snapshot \\
  --packages=$dot_packages \\
  --shell=$flutter_shell \\
  --tests=$tests \\
  --sdk-root=$sdk_root \\
  --icudtl=$icudtl \\
  "$$@"
''')
    with open(test_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(test_file, permissions)


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