<?php
declare(strict_types=1);

namespace App\Framework\Logging;

use App\Framework\Console\ConsoleColor;

/**
 * Enum für Log-Level mit zugehörigen Werten und Namen.
 */
enum LogLevel: int
{
    case DEBUG = 100;
    case INFO = 200;
    case NOTICE = 250;
    case WARNING = 300;
    case ERROR = 400;
    case CRITICAL = 500;
    case ALERT = 550;
    case EMERGENCY = 600;

    /**
     * Gibt den Namen des Log-Levels zurück.
     */
    public function getName(): string
    {
        return match($this) {
            self::DEBUG => 'DEBUG',
            self::INFO => 'INFO',
            self::NOTICE => 'NOTICE',
            self::WARNING => 'WARNING',
            self::ERROR => 'ERROR',
            self::CRITICAL => 'CRITICAL',
            self::ALERT => 'ALERT',
            self::EMERGENCY => 'EMERGENCY',
        };
    }

    /**
     * Gibt die Farbe für die Konsole zurück.
     */
    public function getConsoleColor(): ConsoleColor
    {
        return match($this) {
            self::DEBUG => ConsoleColor::GRAY,
            self::INFO => ConsoleColor::GREEN,
            self::NOTICE => ConsoleColor::CYAN,
            self::WARNING => ConsoleColor::YELLOW,
            self::ERROR => ConsoleColor::RED,
            self::CRITICAL => ConsoleColor::MAGENTA,
            self::ALERT => ConsoleColor::WHITE_ON_RED,
            self::EMERGENCY => ConsoleColor::BLACK_ON_YELLOW,
        };
    }

    /**
     * Erstellt ein LogLevel aus einem Integer-Wert.
     * Gibt das nächstniedrigere Level zurück, wenn der exakte Wert nicht existiert.
     */
    public static function fromValue(int $value): self
    {
        return match(true) {
            $value >= self::EMERGENCY->value => self::EMERGENCY,
            $value >= self::ALERT->value => self::ALERT,
            $value >= self::CRITICAL->value => self::CRITICAL,
            $value >= self::ERROR->value => self::ERROR,
            $value >= self::WARNING->value => self::WARNING,
            $value >= self::NOTICE->value => self::NOTICE,
            $value >= self::INFO->value => self::INFO,
            default => self::DEBUG,
        };
    }
}
