// Copyright (c) 2022, 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.

// coverage:ignore-file

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

const _ansiRed = '\x1b[31m';
const _ansiYellow = '\x1b[33m';
const _ansiDefault = '\x1b[39;49m';

String _colorize(String message, String colorCode) {
  if (stderr.supportsAnsiEscapes) {
    return '$colorCode$message$_ansiDefault';
  }
  return message;
}

Logger log = () {
  final jnigenLogger = Logger('jnigen');
  Logger.root.level = Level.INFO;
  Logger.root.onRecord.listen((r) {
    var message = '(${r.loggerName}) ${r.level.name}: ${r.message}';
    if ((r.level == Level.SHOUT || r.level == Level.SEVERE)) {
      message = _colorize(message, _ansiRed);
    } else if (r.level == Level.WARNING) {
      message = _colorize(message, _ansiYellow);
    }
    stderr.writeln(message);
  });
  return jnigenLogger;
}();

/// Set logging level to [level].
void setLoggingLevel(Level level) {
  /// This initializes `log` as a side effect, so that level setting we apply
  /// is always the last one applied.
  log.fine('Set log level: $level');
  Logger.root.level = level;
}

/// Prints [message] without logging information.
///
/// Primarily used in printing output of failed commands.
void printError(Object? message) {
  stderr.writeln(_colorize(message.toString(), _ansiRed));
}

extension FatalErrors on Logger {
  void fatal(Object? message, {int exitCode = 1}) {
    message = _colorize('Fatal: $message', _ansiRed);
    stderr.writeln(message);
    exit(exitCode);
  }
}
