// 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 '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;
}
