#!/usr/bin/env dart

import 'dart:io';

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

import '../test/completion_tests_args.dart';

void main(List<String> args) {
  final argParser = getHelloSampleParser();

  ArgResults argResult;

  try {
    argResult = tryArgsCompletion(
      args,
      argParser,
      // logFile: '_completion.log',
    );
  } on FormatException catch (ex) {
    // TODO: print color?
    print(ex.message);
    print(argParser.usage);

    /// 64 - C/C++ standard for bad usage.
    exitCode = 64;
    return;
  }

  if (argResult.command != null) {
    final subCommand = argResult.command!;
    final subCommandParser = argParser.commands[subCommand.name]!;

    if (subCommand.name == 'help') {
      // so the help command was run.

      // there are args here, too. Super fun.
      if (subCommand.command != null) {
        // we have a sub-sub command. Fun!
        // let's get the sub-sub command parser

        final subSubCommand = subCommand.command!;
        if (subSubCommand.name == 'assistance') {
          print('Yes, we have help for help...just calling it assistance');
          // let's print sub help. Very crazy.
          print(subCommandParser.usage);
          return;
        } else {
          throw StateError(
            'no clue what that subCammand is: ${subSubCommand.name}',
          );
        }
      }
      // one sub-sub command: help. Really.

      var usage = argParser.usage;

      if (subCommand['yell'] as bool) {
        usage = usage.toUpperCase();
        print("I'm yelling, so the case of the available commands will be off");
      }

      print(usage);
      return;
    }
  }

  final name = argResult.rest.isEmpty ? 'World' : argResult.rest.first;

  final greeting = argResult['friendly'] as bool ? 'Hiya' : 'Hello';

  final salutationVal = argResult['salutation'] as String?;
  final salutation = salutationVal == null ? '' : '$salutationVal ';

  var message = '$greeting, $salutation$name';

  if (argResult['loud'] as bool) {
    message = message.toUpperCase();
  }

  print(message);
}
