// Copyright (c) 2017, 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.
//
// @dart=2.9

import 'dart:collection';
import 'dart:io';

import '../../util/io.dart';
import '../configuration.dart';
import '../engine.dart';
import '../reporter.dart';
import '../reporter/compact.dart';
import '../reporter/expanded.dart';
import '../reporter/json.dart';

/// Constructs a reporter for the provided engine with the provided
/// configuration.
typedef ReporterFactory = Reporter Function(Configuration, Engine, StringSink);

/// Container for a reporter description and corresponding factory.
class ReporterDetails {
  final String description;
  final ReporterFactory factory;
  ReporterDetails(this.description, this.factory);
}

/// All reporters and their corresponding details.
final UnmodifiableMapView<String, ReporterDetails> allReporters =
    UnmodifiableMapView<String, ReporterDetails>(_allReporters);

final _allReporters = <String, ReporterDetails>{
  'expanded': ReporterDetails(
      'A separate line for each update.',
      (config, engine, sink) => ExpandedReporter.watch(engine, sink,
          color: config.color,
          printPath: config.paths.length > 1 ||
              Directory(config.paths.single).existsSync(),
          printPlatform: config.suiteDefaults.runtimes.length > 1)),
  'compact': ReporterDetails(
      'A single line, updated continuously.',
      (config, engine, sink) => CompactReporter.watch(engine, sink,
          color: config.color,
          printPath: config.paths.length > 1 ||
              Directory(config.paths.single).existsSync(),
          printPlatform: config.suiteDefaults.runtimes.length > 1)),
  'json': ReporterDetails(
      'A machine-readable format (see '
      'https://dart.dev/go/test-docs/json_reporter.md).',
      (_, engine, sink) => JsonReporter.watch(engine, sink)),
};

final defaultReporter = inTestTests
    ? 'expanded'
    : canUseSpecialChars
        ? 'compact'
        : 'expanded';

/// **Do not call this function without express permission from the test package
/// authors**.
///
/// This globally registers a reporter.
void registerReporter(String name, ReporterDetails reporterDetails) {
  _allReporters[name] = reporterDetails;
}
