<?php

declare(strict_types=1);

namespace App\Framework\Logging;

use App\Framework\Core\PathProvider;

/**
 * Zentrale Konfiguration für Logpfade
 */
final class LogConfig
{
    /**
     * @var array<string, string> Konfigurierte Logpfade
     */
    private array $logPaths;

    /**
     * @var PathProvider PathProvider für die Auflösung von Pfaden
     */
    private PathProvider $pathProvider;

    /**
     * Erstellt eine neue LogConfig-Instanz
     */
    public function __construct(PathProvider $pathProvider)
    {
        $this->pathProvider = $pathProvider;

        // Basis-Logverzeichnis (storage/logs für moderne PHP Framework Convention)
        $logBasePath = 'storage/logs';

        // Standard-Logpfade definieren
        $this->logPaths = [
            // Anwendungslogs
            'app' => $this->resolvePath($logBasePath . '/app/app.log'),
            'error' => $this->resolvePath($logBasePath . '/app/error.log'),

            // Systemlogs
            'nginx_access' => '/var/log/nginx/access.log',
            'nginx_error' => '/var/log/nginx/error.log',

            // Sicherheitslogs
            'security' => $this->resolvePath($logBasePath . '/security/security.log'),

            // Debug-Logs
            'framework' => $this->resolvePath($logBasePath . '/debug/framework.log'),
            'cache' => $this->resolvePath($logBasePath . '/debug/cache.log'),
            'database' => $this->resolvePath($logBasePath . '/debug/database.log'),
        ];

        // Hinweis: Umgebungsvariablen werden nicht mehr direkt verwendet
        // Konfiguration erfolgt über das Framework-Konfigurationssystem
    }

    /**
     * Gibt den Pfad für einen bestimmten Log-Typ zurück
     */
    public function getLogPath(string $type): string
    {
        return $this->logPaths[$type] ?? $this->logPaths['app'];
    }

    /**
     * Gibt alle konfigurierten Logpfade zurück
     *
     * @return array<string, string>
     */
    public function getAllLogPaths(): array
    {
        return $this->logPaths;
    }

    /**
     * Löst einen relativen Pfad auf
     */
    private function resolvePath(string $path): string
    {
        return $this->pathProvider->resolvePath($path);
    }

    /**
     * Gibt den Basis-Logpfad zurück
     */
    public function getBaseLogPath(): string
    {
        return dirname($this->logPaths['app']);
    }

    /**
     * Stellt sicher, dass alle Logverzeichnisse existieren
     */
    public function ensureLogDirectoriesExist(): void
    {
        foreach ($this->logPaths as $path) {
            $dir = dirname($path);
            if (! file_exists($dir)) {
                try {
                    if (is_writable(dirname($dir))) {
                        mkdir($dir, 0777, true);
                    }
                } catch (\Exception $e) {
                    // Silently ignore if we can't create directories
                    // This allows the log viewer to work even if some log directories can't be created
                }
            }
        }
    }
}
