// Copyright (c) 2020, 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 'dart:async';

import 'package:logging/logging.dart';
import 'package:test/test.dart';

typedef LogWriter =
    void Function(
      Level level,
      String message, {
      String? error,
      String? loggerName,
      String? stackTrace,
    });

StreamSubscription<LogRecord>? _loggerSub;

/// Redirect the logs for the current zone to emit on failure.
///
/// If [debug] is false, messages are stored and reported on test failure.
/// If [debug] is true, messages are always printed to the console.
///
/// Note that the [LogWriter] uses [printOnFailure] that stores the messages
/// on the current zone. As a result, [setCurrentLogWriter] needs to be set
/// in both `setUpAll` and `setUp` to store messages for the same zone as the
/// failure in order to report all stored messages on that failure.
///
/// For example:
///
/// // Enable verbose logging for debugging.
/// bool debug = true;
///
/// group('shared context', () {
///     setUpAll(() async {
///       // Set the logger for the current group.
///       setCurrentLogWriter(debug: debug);
///       ...
///     });
///     setUp(() async {
///       // Reset the logger for the current test.
///       setCurrentLogWriter(debug: debug);
///       ...
///     });
///     ...
/// });
void setCurrentLogWriter({bool debug = false}) =>
    configureLogWriter(customLogWriter: createLogWriter(debug: debug));

/// Configure test log writer.
///
/// Tests and groups of tests can use this to configure individual
/// log writers on setup.
void configureLogWriter({LogWriter? customLogWriter}) {
  _logWriter = customLogWriter ?? _logWriter;
  Logger.root.level = Level.ALL;
  _loggerSub?.cancel();
  _loggerSub = Logger.root.onRecord.listen((event) {
    logWriter(
      event.level,
      event.message,
      error: event.error?.toString(),
      loggerName: event.loggerName,
      stackTrace: event.stackTrace?.toString(),
    );
  });
}

void stopLogWriter() {
  _loggerSub?.cancel();
  _loggerSub = null;
}

LogWriter _logWriter = createLogWriter();

LogWriter createLogWriter({bool debug = false}) =>
    (level, message, {String? error, String? loggerName, String? stackTrace}) {
      final printFn = debug ? print : printOnFailure;
      final errorMessage = error == null ? '' : ':\n$error';
      final stackMessage = stackTrace == null ? '' : ':\n$stackTrace';
      printFn(
        '[$level] $loggerName: $message'
        '$errorMessage'
        '$stackMessage',
      );
    };

LogWriter get logWriter => _logWriter;
