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

// @dart=2.9

import 'dart:io' as io;

import 'package:args/command_runner.dart';
import 'package:file/file.dart';
import 'package:file/local.dart';
import 'package:flutter_plugin_tools/src/publish_check_command.dart';
import 'package:flutter_plugin_tools/src/publish_plugin_command.dart';
import 'package:path/path.dart' as p;

import 'analyze_command.dart';
import 'build_examples_command.dart';
import 'common.dart';
import 'create_all_plugins_app_command.dart';
import 'drive_examples_command.dart';
import 'firebase_test_lab_command.dart';
import 'format_command.dart';
import 'java_test_command.dart';
import 'license_check_command.dart';
import 'lint_podspecs_command.dart';
import 'list_command.dart';
import 'test_command.dart';
import 'version_check_command.dart';
import 'xctest_command.dart';

void main(List<String> args) {
  const FileSystem fileSystem = LocalFileSystem();

  Directory packagesDir = fileSystem
      .directory(p.join(fileSystem.currentDirectory.path, 'packages'));

  if (!packagesDir.existsSync()) {
    if (p.basename(fileSystem.currentDirectory.path) == 'packages') {
      packagesDir = fileSystem.currentDirectory;
    } else {
      print('Error: Cannot find a "packages" sub-directory');
      io.exit(1);
    }
  }

  final CommandRunner<void> commandRunner = CommandRunner<void>(
      'pub global run flutter_plugin_tools',
      'Productivity utils for hosting multiple plugins within one repository.')
    ..addCommand(AnalyzeCommand(packagesDir, fileSystem))
    ..addCommand(BuildExamplesCommand(packagesDir, fileSystem))
    ..addCommand(CreateAllPluginsAppCommand(packagesDir, fileSystem))
    ..addCommand(DriveExamplesCommand(packagesDir, fileSystem))
    ..addCommand(FirebaseTestLabCommand(packagesDir, fileSystem))
    ..addCommand(FormatCommand(packagesDir, fileSystem))
    ..addCommand(JavaTestCommand(packagesDir, fileSystem))
    ..addCommand(LicenseCheckCommand(packagesDir, fileSystem))
    ..addCommand(LintPodspecsCommand(packagesDir, fileSystem))
    ..addCommand(ListCommand(packagesDir, fileSystem))
    ..addCommand(PublishCheckCommand(packagesDir, fileSystem))
    ..addCommand(PublishPluginCommand(packagesDir, fileSystem))
    ..addCommand(TestCommand(packagesDir, fileSystem))
    ..addCommand(VersionCheckCommand(packagesDir, fileSystem))
    ..addCommand(XCTestCommand(packagesDir, fileSystem));

  commandRunner.run(args).catchError((Object e) {
    final ToolExit toolExit = e as ToolExit;
    io.exit(toolExit.exitCode);
  }, test: (Object e) => e is ToolExit);
}
