#!/usr/bin/env python3
#
# Copyright 2013 The Flutter 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 re
import sys


def main():
  parser = argparse.ArgumentParser(
      sys.argv[0], description="Generate main file for Fuchsia dart test"
  )
  parser.add_argument(
      "--out", help="Path to .dart file to generate", required=True
  )
  parser.add_argument(
      "--main-dart", help="Path to main.dart file to import", required=True
  )
  args = parser.parse_args()
  out_dir = os.path.dirname(args.out)
  assert os.path.isfile(os.path.join(os.path.dirname(args.out), args.main_dart))
  outfile = open(args.out, 'w')

  # Ignores relative lib imports due to a few modules that complain about
  # this. It is also possible that a future may be unawaited given that main
  # may not always be synchronous across all functions.
  outfile.write('''// Generated by ''')
  outfile.write(os.path.basename(__file__))
  outfile.write(
      '''


// ignore_for_file: avoid_relative_lib_imports
import 'dart:async';

import 'package:flutter_driver/driver_extension.dart';
'''
  )
  outfile.write("import '%s' as flutter_app_main;\n" % args.main_dart)
  outfile.write(
      '''
void main() async {
  assert(await (() async {
    // TODO(awdavies): Use the logger instead.
    print('Overriding app main method because flutter_driver_extendable '
        'is enabled in the build file');

    try {
      // Enables Flutter Driver VM service extension
      //
      // This extension is required for tests that use package:flutter_driver
      // to drive applications from a separate process.
      enableFlutterDriverExtension();

      // TODO(awdavies): Use the logger instead.
      print('flutter driver extensions enabled.');
      //ignore: avoid_catches_without_on_clauses
    } catch (e) {
      // TODO(awdavies): Use the logger instead.
      // Noop.
      print('flutter driver extensions not enabled. $e');
    }
    // Always return true so that the assert succeeds.
    return true;
  }()));
  // Execute the main method of the app under test
  var res = (flutter_app_main.main as dynamic)();
  if (res != null && res is Future) {
    await res;
  }
}
'''
  )
  outfile.close()


if __name__ == '__main__':
  main()
