using Mbproxy.Diagnostics;
using Shouldly;
using Xunit;

namespace Mbproxy.Tests.Diagnostics;

/// <summary>
/// Unit tests for <see cref="DiagnosticSinkSelector"/> — the pure platform-selection
/// logic for the Error+ diagnostic sink. Covers every OS / host combination so the
/// selection contract is pinned without needing a real Windows Service or systemd host.
/// </summary>
[Trait("Category", "Unit")]
public sealed class DiagnosticSinkSelectorTests
{
    // 'expected' is the underlying int of DiagnosticSink: the enum is internal and
    // cannot appear in a public (xunit-discoverable) method signature.
    [Theory]
    [InlineData(true,  true,  false, (int)DiagnosticSink.EventLog)] // Windows, hosted as a Windows Service
    [InlineData(true,  false, false, (int)DiagnosticSink.None)]     // Windows, interactive / dev run
    [InlineData(false, false, true,  (int)DiagnosticSink.Syslog)]   // Linux, hosted as a systemd service
    [InlineData(false, false, false, (int)DiagnosticSink.None)]     // Linux / macOS, interactive / dev run
    public void Select_PicksExpectedSink(
        bool isWindows, bool isWindowsService, bool isSystemd, int expected)
        => ((int)DiagnosticSinkSelector.Select(isWindows, isWindowsService, isSystemd)).ShouldBe(expected);

    [Fact]
    public void Select_Windows_TakesPrecedence_OverASpuriousSystemdFlag()
        => DiagnosticSinkSelector.Select(isWindows: true, isWindowsService: true, isSystemd: true)
            .ShouldBe(DiagnosticSink.EventLog);

    [Fact]
    public void Select_WindowsConsoleRun_GetsNoSink_EvenIfSystemdFlagSet()
        => DiagnosticSinkSelector.Select(isWindows: true, isWindowsService: false, isSystemd: true)
            .ShouldBe(DiagnosticSink.None);

    [Fact]
    public void Select_NonWindowsWithoutSystemd_GetsNoSink()
        => DiagnosticSinkSelector.Select(isWindows: false, isWindowsService: false, isSystemd: false)
            .ShouldBe(DiagnosticSink.None);
}
