using ZB.MOM.WW.ScadaBridge.AuditLog.Central;

namespace ZB.MOM.WW.ScadaBridge.AuditLog.Tests.Central;

/// <summary>
/// Eager startup validation for <see cref="AuditLogPurgeOptions"/>
/// (arch-review 08 round 2 NF4). The class self-clamps at resolve time, but a
/// plainly-wrong config (zero cadence, zero batch, zero command timeout) should
/// still fail the boot so the operator learns immediately.
/// <see cref="AuditLogPurgeOptions.IntervalOverride"/> is test-only and left
/// unvalidated.
/// </summary>
public class AuditLogPurgeOptionsValidatorTests
{
    [Fact]
    public void DefaultOptions_AreValid()
    {
        var validator = new AuditLogPurgeOptionsValidator();
        Assert.True(validator.Validate(null, new AuditLogPurgeOptions()).Succeeded);
    }

    [Fact]
    public void ZeroIntervalHours_Fails()
    {
        var validator = new AuditLogPurgeOptionsValidator();
        var result = validator.Validate(null, new AuditLogPurgeOptions { IntervalHours = 0 });
        Assert.False(result.Succeeded);
        Assert.Contains(result.Failures!,
            f => f.Contains(nameof(AuditLogPurgeOptions.IntervalHours), StringComparison.Ordinal));
    }

    [Fact]
    public void ZeroChannelPurgeBatchSize_Fails()
    {
        var validator = new AuditLogPurgeOptionsValidator();
        var result = validator.Validate(null,
            new AuditLogPurgeOptions { ChannelPurgeBatchSizeConfigured = 0 });
        Assert.False(result.Succeeded);
        Assert.Contains(result.Failures!,
            f => f.Contains(nameof(AuditLogPurgeOptions.ChannelPurgeBatchSizeConfigured), StringComparison.Ordinal));
    }

    [Fact]
    public void ZeroMaintenanceCommandTimeout_Fails()
    {
        var validator = new AuditLogPurgeOptionsValidator();
        var result = validator.Validate(null,
            new AuditLogPurgeOptions { MaintenanceCommandTimeoutMinutes = 0 });
        Assert.False(result.Succeeded);
        Assert.Contains(result.Failures!,
            f => f.Contains(nameof(AuditLogPurgeOptions.MaintenanceCommandTimeoutMinutes), StringComparison.Ordinal));
    }
}
