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