using Serilog;

namespace NATS.Server.Tests;

public class LoggingTests : IDisposable
{
    private readonly string _logDir;

    public LoggingTests()
    {
        _logDir = Path.Combine(Path.GetTempPath(), $"nats-log-test-{Guid.NewGuid():N}");
        Directory.CreateDirectory(_logDir);
    }

    public void Dispose()
    {
        try { Directory.Delete(_logDir, true); } catch { }
    }

    [Fact]
    public void File_sink_creates_log_file()
    {
        var logPath = Path.Combine(_logDir, "test.log");

        using var logger = new LoggerConfiguration()
            .WriteTo.File(logPath)
            .CreateLogger();

        logger.Information("Hello from test");
        logger.Dispose();

        File.Exists(logPath).ShouldBeTrue();
        var content = File.ReadAllText(logPath);
        content.ShouldContain("Hello from test");
    }

    [Fact]
    public void File_sink_rotates_on_size_limit()
    {
        var logPath = Path.Combine(_logDir, "rotate.log");

        using var logger = new LoggerConfiguration()
            .WriteTo.File(
                logPath,
                fileSizeLimitBytes: 200,
                rollOnFileSizeLimit: true,
                retainedFileCountLimit: 3)
            .CreateLogger();

        // Write enough to trigger rotation
        for (int i = 0; i < 50; i++)
            logger.Information("Log message number {Number} with some padding text", i);

        logger.Dispose();

        // Should have created rotated files
        var logFiles = Directory.GetFiles(_logDir, "rotate*.log");
        logFiles.Length.ShouldBeGreaterThan(1);
    }
}
