<?php

declare(strict_types=1);

namespace App\Framework\Logging;

use App\Framework\DateTime\Clock;
use App\Framework\DateTime\SystemClock;

/**
 * Factory für Logger-Instanzen.
 *
 * @deprecated Verwende stattdessen Dependency Injection. Der Logger wird automatisch über LoggerInitializer erstellt.
 * Diese Klasse wird nur noch für Legacy-Code verwendet und sollte nicht in neuem Code genutzt werden.
 */
final class LoggerFactory
{
    private static ?DefaultLogger $defaultLogger = null;

    /**
     * Erzeugt einen neuen Logger mit optionalen Einstellungen.
     *
     * @deprecated Verwende stattdessen Dependency Injection. Der Logger wird automatisch über LoggerInitializer erstellt.
     */
    public static function create(
        ?Clock $clock = null,
        LogLevel|int $minLevel = LogLevel::DEBUG,
        array $handlers = []
    ): DefaultLogger {
        $clock ??= new SystemClock();
        
        return new DefaultLogger($clock, $minLevel, $handlers);
    }

    /**
     * Gibt den Standard-Logger zurück oder erstellt ihn, falls er noch nicht existiert.
     *
     * @deprecated Verwende stattdessen Dependency Injection. Der Logger wird automatisch über LoggerInitializer erstellt.
     */
    public static function getDefaultLogger(): DefaultLogger
    {
        if (self::$defaultLogger === null) {
            $debug = filter_var(getenv('APP_DEBUG'), FILTER_VALIDATE_BOOLEAN);
            $minLevel = $debug ? LogLevel::DEBUG : LogLevel::INFO;

            self::$defaultLogger = self::create(null, $minLevel);
        }

        return self::$defaultLogger;
    }

    /**
     * Setzt einen benutzerdefinierten Logger als Standard-Logger.
     *
     * @deprecated Verwende stattdessen Dependency Injection.
     */
    public static function setDefaultLogger(DefaultLogger $logger): void
    {
        self::$defaultLogger = $logger;
    }
}
