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

import 'package:io/ansi.dart';
import 'package:logging/logging.dart';

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

var _verbose = false;
StreamSubscription<LogRecord> _subscription;

void configureLogWriter(bool verbose, {LogWriter customLogWriter}) {
  _verbose = verbose;
  _logWriter = customLogWriter ?? _logWriter;
  Logger.root.level = verbose ? Level.ALL : Level.INFO;
  _subscription ??= Logger.root.onRecord.listen((event) {
    logWriter(event.level, event.message,
        error: event.error?.toString(),
        loggerName: event.loggerName,
        stackTrace: event.stackTrace?.toString());
  });
}

// ignore: prefer_function_declarations_over_variables
LogWriter _logWriter =
    (level, message, {String error, String loggerName, String stackTrace}) {
  // Erases the previous line
  if (!_verbose) stdout.write('\x1b[2K\r');
  var log = formatLog(level, message,
      error: error,
      loggerName: loggerName,
      stackTrace: stackTrace,
      withColors: true);

  if (level >= Level.INFO || _verbose) {
    stdout.write(log);
    // Prevent multiline logs and > info messages from being erased.
    if (level > Level.INFO ||
        _verbose ||
        (log.contains('\n') && !log.endsWith('\n'))) {
      stdout.writeln('');
    }
  }
};

LogWriter get logWriter => _logWriter;

/// Colors the message and writes it to stdout.
String formatLog(Level level, String message,
    {bool withColors, String error, String loggerName, String stackTrace}) {
  withColors ??= false;
  var buffer = StringBuffer(message);
  if (error != null) {
    buffer.writeln(error);
  }

  if (_verbose && stackTrace != null) {
    buffer.writeln(stackTrace);
  }

  var formattedLevel = '[$level]';
  if (withColors) {
    AnsiCode color;
    if (level < Level.WARNING) {
      color = cyan;
    } else if (level < Level.SEVERE) {
      color = yellow;
    } else {
      color = red;
    }
    formattedLevel = color.wrap(formattedLevel);
  }

  var loggerNameOutput =
      (loggerName != null && (_verbose || loggerName.contains(' ')))
          ? ' $loggerName:'
          : '';
  return '$formattedLevel$loggerNameOutput $buffer';
}
