namespace Mbproxy.Diagnostics;

/// <summary>
/// The platform diagnostic sink to wire for <c>Error</c>+ events — picked once,
/// at the composition root, by <see cref="DiagnosticSinkSelector"/>.
/// </summary>
internal enum DiagnosticSink
{
    /// <summary>
    /// No platform diagnostic sink — console (and rolling-file) sinks only. Used
    /// for interactive / dev runs on every OS.
    /// </summary>
    None,

    /// <summary>
    /// Windows Application Event Log, via <see cref="EventLogBridge"/>. Selected
    /// only when the process is hosted as a Windows Service.
    /// </summary>
    EventLog,

    /// <summary>
    /// Local syslog, via <see cref="SyslogBridge"/>. Selected only when the
    /// process is hosted as a systemd service on Linux.
    /// </summary>
    Syslog,
}

/// <summary>
/// Pure platform-selection logic for the <c>Error</c>+ diagnostic sink. Holds no
/// I/O and no host APIs so it is unit-testable for every OS / host combination;
/// the host detection itself happens in <see cref="HostingExtensions.AddMbproxySerilog"/>.
/// </summary>
internal static class DiagnosticSinkSelector
{
    /// <summary>
    /// Picks the diagnostic sink for the current host:
    /// <list type="bullet">
    ///   <item>Windows hosted as a Windows Service → <see cref="DiagnosticSink.EventLog"/>.</item>
    ///   <item>Linux hosted as a systemd service → <see cref="DiagnosticSink.Syslog"/>.</item>
    ///   <item>Everything else — interactive / dev runs, macOS, launches not owned
    ///         by an init system → <see cref="DiagnosticSink.None"/>.</item>
    /// </list>
    /// The managed-service gate mirrors the original <see cref="EventLogBridge"/>
    /// contract: a diagnostic sink is wired only when an init system actually owns
    /// the process, so dev / console runs never need an Event Log source registered
    /// or a syslog socket reachable.
    /// </summary>
    /// <param name="isWindows">Running on Windows.</param>
    /// <param name="isWindowsService">Hosted by the Windows Service Control Manager.</param>
    /// <param name="isSystemd">Hosted by systemd.</param>
    public static DiagnosticSink Select(bool isWindows, bool isWindowsService, bool isSystemd)
    {
        // Windows takes precedence: isSystemd is meaningless there, and on
        // non-Windows isWindowsService is always false.
        if (isWindows)
            return isWindowsService ? DiagnosticSink.EventLog : DiagnosticSink.None;

        return isSystemd ? DiagnosticSink.Syslog : DiagnosticSink.None;
    }
}
