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

/// Prints the contents of a [LogRecord] with pretty colors.
///
/// By passing [omitError], you can omit printing the error of a given
/// [LogRecord].
///
/// You can also pass a custom [printFunction] or [logColorChooser].
void prettyLog(LogRecord record,
    {bool Function(LogRecord)? omitError,
    void Function(String)? printFunction,
    AnsiCode Function(Level)? logColorChooser}) {
  logColorChooser ??= chooseLogColor;
  omitError ??= (_) => false;
  printFunction ??= print;

  var code = logColorChooser(record.level);
  if (record.error == null) {
    printFunction(code.wrap(record.toString()) ?? "");
  }

  if (record.error != null) {
    var err = record.error;
    if (omitError(record)) return;
    printFunction(code.wrap('$record\n') ?? "");
    printFunction(code.wrap(err.toString()) ?? "");

    if (record.stackTrace != null) {
      printFunction(code.wrap(record.stackTrace.toString()) ?? "");
    }
  }
}

/// Chooses a color based on the logger [level].
AnsiCode chooseLogColor(Level level) {
  if (level == Level.SHOUT) {
    return backgroundRed;
  } else if (level == Level.SEVERE) {
    return red;
  } else if (level == Level.WARNING) {
    return yellow;
  } else if (level == Level.INFO) {
    return cyan;
  } else if (level == Level.CONFIG ||
      level == Level.FINE ||
      level == Level.FINER ||
      level == Level.FINEST) {
    return lightGray;
  }
  return resetAll;
}
