// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

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

class CommandRunnerWithFooter extends CommandRunner {
  @override
  String get usageFooter => 'Also, footer!';

  CommandRunnerWithFooter(super.executableName, super.description);
}

class CommandRunnerWithFooterAndWrapping extends CommandRunner {
  @override
  String get usageFooter => 'LONG footer! '
      'This is a long footer, so we can check wrapping on long footer messages.'
      '\n\n'
      'And make sure that they preserve newlines properly.';

  @override
  ArgParser get argParser => _argParser;
  final _argParser = ArgParser(usageLineLength: 40);

  CommandRunnerWithFooterAndWrapping(super.executableName, super.description);
}

class FooCommand extends Command {
  bool hasRun = false;

  @override
  final name = 'foo';

  @override
  final description = 'Set a value.';

  @override
  final takesArguments = false;

  @override
  void run() {
    hasRun = true;
  }
}

class ValueCommand extends Command<int> {
  @override
  final name = 'foo';

  @override
  final description = 'Return a value.';

  @override
  final takesArguments = false;

  @override
  int run() => 12;
}

class AsyncValueCommand extends Command<String> {
  @override
  final name = 'foo';

  @override
  final description = 'Return a future.';

  @override
  final takesArguments = false;

  @override
  Future<String> run() async => 'hi';
}

class Category1Command extends Command {
  bool hasRun = false;

  @override
  final name = 'bar';

  @override
  final description = 'Print a value.';

  @override
  final category = 'Printers';

  @override
  final takesArguments = false;

  @override
  void run() {
    hasRun = true;
  }
}

class Category2Command extends Command {
  bool hasRun = false;

  @override
  final name = 'baz';

  @override
  final description = 'Display a value.';

  @override
  final category = 'Displayers';

  @override
  final takesArguments = false;

  @override
  void run() {
    hasRun = true;
  }
}

class Category2Command2 extends Command {
  bool hasRun = false;

  @override
  final name = 'baz2';

  @override
  final description = 'Display another value.';

  @override
  final category = 'Displayers';

  @override
  final takesArguments = false;

  @override
  void run() {
    hasRun = true;
  }
}

class MultilineCommand extends Command {
  bool hasRun = false;

  @override
  final name = 'multiline';

  @override
  final description = 'Multi\nline.';

  @override
  final takesArguments = false;

  @override
  void run() {
    hasRun = true;
  }
}

class WrappingCommand extends Command {
  bool hasRun = false;

  @override
  ArgParser get argParser => _argParser;
  final _argParser = ArgParser(usageLineLength: 40);

  @override
  final name = 'wrapping';

  @override
  final description =
      'This command overrides the argParser so that it will wrap long lines.';

  @override
  final takesArguments = false;

  @override
  void run() {
    hasRun = true;
  }
}

class LongCommand extends Command {
  bool hasRun = false;

  @override
  ArgParser get argParser => _argParser;
  final _argParser = ArgParser(usageLineLength: 40);

  @override
  final name = 'long';

  @override
  final description =
      'This command has a long description that needs to be wrapped '
      'sometimes.\nIt has embedded newlines,\n'
      '     and indented lines that also need to be wrapped and have their '
      'indentation preserved.\n${'0123456789' * 10}';

  @override
  final takesArguments = false;

  @override
  void run() {
    hasRun = true;
  }
}

class MultilineSummaryCommand extends MultilineCommand {
  @override
  String get summary => description;
}

class HiddenCommand extends Command {
  bool hasRun = false;

  @override
  final name = 'hidden';

  @override
  final description = 'Set a value.';

  @override
  final hidden = true;

  @override
  final takesArguments = false;

  @override
  void run() {
    hasRun = true;
  }
}

class HiddenCategorizedCommand extends Command {
  bool hasRun = false;

  @override
  final name = 'hiddencategorized';

  @override
  final description = 'Set a value.';

  @override
  final category = 'Some category';

  @override
  final hidden = true;

  @override
  final takesArguments = false;

  @override
  void run() {
    hasRun = true;
  }
}

class AliasedCommand extends Command {
  bool hasRun = false;

  @override
  final name = 'aliased';

  @override
  final description = 'Set a value.';

  @override
  final takesArguments = false;

  @override
  final aliases = const ['alias', 'als'];

  @override
  void run() {
    hasRun = true;
  }
}

class AsyncCommand extends Command {
  bool hasRun = false;

  @override
  final name = 'async';

  @override
  final description = 'Set a value asynchronously.';

  @override
  final takesArguments = false;

  @override
  Future run() => Future.value().then((_) => hasRun = true);
}

class AllowAnythingCommand extends Command {
  bool hasRun = false;

  @override
  final name = 'allowAnything';

  @override
  final description = 'A command using allowAnything.';

  @override
  final argParser = ArgParser.allowAnything();

  @override
  void run() {
    hasRun = true;
  }
}

class CustomNameCommand extends Command {
  @override
  final String name;

  CustomNameCommand(this.name);

  @override
  String get description => 'A command with a custom name';
}

void throwsIllegalArg(void Function() function, {String? reason}) {
  expect(function, throwsArgumentError, reason: reason);
}

void throwsFormat(ArgParser parser, List<String> args) {
  expect(() => parser.parse(args), throwsFormatException);
}

Matcher throwsUsageException(Object? message, Object? usage) =>
    throwsA(isA<UsageException>()
        .having((e) => e.message, 'message', message)
        .having((e) => e.usage, 'usage', usage));
