// 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.

// ignore_for_file: avoid_print

// Generates the pigeon output files needed for platform_test tests.
//
// Eventually this may get more options to control which files are generated,
// but for now it always generates everything needed for the platform unit
// tests.

import 'dart:io' show Platform, exit;

import 'package:args/args.dart';
import 'package:path/path.dart' as p;

import 'shared/generation.dart';

const String _helpFlag = 'help';
const String _formatFlag = 'format';
const String _noFormatFlag = 'no-format';
const String _files = 'files';
const String _test = 'test';
const String _example = 'example';

const List<String> _fileGroups = <String>[_test, _example];

Future<void> main(List<String> args) async {
  final ArgParser parser = ArgParser()
    ..addFlag(
      _formatFlag,
      abbr: 'f',
      help:
          'Autoformat after generation. This flag is no longer needed, as this behavior is the default',
      defaultsTo: true,
      hide: true,
    )
    ..addFlag(
      _noFormatFlag,
      abbr: 'n',
      help: 'Do not autoformat after generation.',
    )
    ..addFlag(_helpFlag,
        negatable: false, abbr: 'h', help: 'Print this reference.')
    ..addMultiOption(_files,
        help:
            'Select specific groups of files to generate; $_test or $_example. Defaults to both.',
        allowed: _fileGroups);

  final ArgResults argResults = parser.parse(args);
  if (argResults.wasParsed(_helpFlag)) {
    print('''
usage: dart run tool/generate.dart [options]

${parser.usage}''');
    exit(0);
  }

  final String baseDir = p.dirname(p.dirname(Platform.script.toFilePath()));

  final List<String> toGenerate = argResults.wasParsed(_files)
      ? argResults[_files] as List<String>
      : _fileGroups;

  if (toGenerate.contains(_test)) {
    print('Generating platform_test/ output...');
    final int generateExitCode = await generateTestPigeons(baseDir: baseDir);
    if (generateExitCode == 0) {
      print('Generation complete!');
    } else {
      print('Generation failed; see above for errors.');
      exit(generateExitCode);
    }
  }

  if (toGenerate.contains(_example)) {
    print('Generating example/ output...');
    final int generateExitCode = await generateExamplePigeons();
    if (generateExitCode == 0) {
      print('Generation complete!');
    } else {
      print('Generation failed; see above for errors.');
      exit(generateExitCode);
    }
  }

  if (!argResults.wasParsed(_noFormatFlag)) {
    print('Formatting generated output...');
    final int formatExitCode =
        await formatAllFiles(repositoryRoot: p.dirname(p.dirname(baseDir)));
    if (formatExitCode != 0) {
      print('Formatting failed; see above for errors.');
      exit(formatExitCode);
    }
  }
}
