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

import 'dart:io' as io;

import 'package:args/args.dart';
import 'package:args/command_runner.dart';

import 'src/pre_push_command.dart';

/// Runs the githooks
Future<int> run(List<String> args) async {
  final CommandRunner<bool> runner = CommandRunner<bool> (
    'githooks',
    'Githooks implementation for the flutter/engine repo.',
  )
  ..addCommand(PrePushCommand());

  // Add top-level arguments.
  runner.argParser
    ..addOption(
      'flutter',
      abbr: 'f',
      help: 'The absolute path to the root of the flutter/engine checkout.',
    )
    ..addFlag(
      'verbose',
      abbr: 'v',
      help: 'Runs with verbose logging',
      defaultsTo: false,
    );

  if (args.isEmpty) {
    // The tool was invoked with no arguments. Print usage.
    runner.printUsage();
    return 1;
  }

  final ArgResults argResults = runner.parse(args);
  final String? argMessage = _checkArgs(argResults);
  if (argMessage != null) {
    io.stderr.writeln(argMessage);
    runner.printUsage();
    return 1;
  }

  final bool commandResult = await runner.runCommand(argResults) ?? false;
  return commandResult ? 0 : 1;
}

String? _checkArgs(ArgResults argResults) {
  if (argResults.command?.name == 'help') {
    return null;
  }

  if (argResults['help'] as bool) {
    return null;
  }

  if (argResults['flutter'] == null) {
    return 'The --flutter option is required';
  }

  final io.Directory dir = io.Directory(argResults['flutter'] as String);
  if (!dir.isAbsolute) {
    return 'The --flutter option must be an absolute path';
  }

  if (!dir.existsSync()) {
    return 'The directory specified by the --flutter option must exist';
  }

  return null;
}
