using OF_DL.Enumerations;
using Serilog;
using Serilog.Core;
using Serilog.Events;

namespace OF_DL.Services;

public class LoggingService : ILoggingService
{
    public LoggingService()
    {
        LevelSwitch = new LoggingLevelSwitch();
        InitializeLogger();
    }

    /// <summary>
    /// Gets the level switch that controls runtime logging verbosity.
    /// </summary>
    public LoggingLevelSwitch LevelSwitch { get; }

    /// <summary>
    /// Updates the minimum logging level at runtime.
    /// </summary>
    /// <param name="newLevel">The new minimum log level.</param>
    public void UpdateLoggingLevel(LoggingLevel newLevel)
    {
        LevelSwitch.MinimumLevel = (LogEventLevel)newLevel;
        Log.Debug("Logging level updated to: {LoggingLevel}", newLevel);
    }

    /// <summary>
    /// Returns the current minimum logging level.
    /// </summary>
    public LoggingLevel GetCurrentLoggingLevel() => (LoggingLevel)LevelSwitch.MinimumLevel;

    private void InitializeLogger()
    {
        // Set the initial level to Error (until we've read from config)
        LevelSwitch.MinimumLevel = LogEventLevel.Error;

        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.ControlledBy(LevelSwitch)
            .WriteTo.File("logs/OFDL.txt", rollingInterval: RollingInterval.Day)
            .CreateLogger();

        Log.Debug("Logging service initialized");
    }
}
