// Copyright 2014 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 'package:args/args.dart';
import 'package:packages_autoroller/src/stdio.dart';
import 'package:test/fake.dart';
import 'package:test/test.dart';

export 'package:test/fake.dart';
export 'package:test/test.dart' hide isInstanceOf;
export '../../../packages/flutter_tools/test/src/fake_process_manager.dart';

Matcher throwsAssertionWith(String messageSubString) {
  return throwsA(
    isA<AssertionError>().having(
      (AssertionError e) => e.toString(),
      'description',
      contains(messageSubString),
    ),
  );
}

Matcher throwsExceptionWith(String messageSubString) {
  return throwsA(
    isA<Exception>().having(
      (Exception e) => e.toString(),
      'description',
      contains(messageSubString),
    ),
  );
}

class TestStdio extends Stdio {
  TestStdio({this.verbose = false, List<String>? stdin}) : stdin = stdin ?? <String>[];

  String get error => logs.where((String log) => log.startsWith(r'[error] ')).join('\n');

  String get stdout => logs
      .where((String log) {
        return log.startsWith(r'[status] ') ||
            log.startsWith(r'[trace] ') ||
            log.startsWith(r'[write] ');
      })
      .join('\n');

  final bool verbose;
  final List<String> stdin;

  @override
  String readLineSync() {
    if (stdin.isEmpty) {
      throw Exception('Unexpected call to readLineSync! Last stdout was ${logs.last}');
    }
    return stdin.removeAt(0);
  }
}

class FakeArgResults extends Fake implements ArgResults {
  FakeArgResults({
    required String? level,
    required String candidateBranch,
    String remote = 'upstream',
    bool justPrint = false,
    bool autoApprove = true, // so we don't have to mock stdin
    bool help = false,
    bool force = false,
    bool skipTagging = false,
  }) : _parsedArgs = <String, dynamic>{
         'increment': level,
         'candidate-branch': candidateBranch,
         'remote': remote,
         'just-print': justPrint,
         'yes': autoApprove,
         'help': help,
         'force': force,
         'skip-tagging': skipTagging,
       };

  @override
  String? name;

  @override
  ArgResults? command;

  @override
  final List<String> rest = <String>[];

  final Map<String, dynamic> _parsedArgs;

  @override
  dynamic operator [](String name) {
    return _parsedArgs[name];
  }
}
