using System;
using ZB.MOM.WW.MxGateway.Contracts.Proto;

namespace ZB.MOM.WW.MxGateway.Worker.MxAccess;

/// <summary>
///     Raised by <see cref="FailoverAlarmConsumer"/> every time the active
///     alarm source switches between the primary (alarmmgr) consumer and the
///     standby (subtag) consumer. The worker translates this into the proto
///     family <c>OnAlarmProviderModeChanged</c> so connected gateway clients
///     can surface the degraded/recovered state.
/// </summary>
/// <remarks>
///     <para>
///         Plain class with constructor-assigned get-only properties — not a
///         <c>record</c> or <c>init</c>-only type — because the worker
///         multi-targets .NET Framework 4.8, which lacks
///         <c>System.Runtime.CompilerServices.IsExternalInit</c> (CS0518).
///     </para>
/// </remarks>
public sealed class AlarmProviderModeChange : EventArgs
{
    /// <summary>
    ///     Initializes the change event payload.
    /// </summary>
    /// <param name="mode">The provider mode now active after the switch.</param>
    /// <param name="reason">Human-readable reason for the switch.</param>
    /// <param name="hResult">
    ///     The COM HRESULT that triggered a failover, or 0 for a clean
    ///     failback / no associated HRESULT.
    /// </param>
    /// <param name="atUtc">The UTC instant the switch occurred.</param>
    public AlarmProviderModeChange(AlarmProviderMode mode, string reason, int hResult, DateTime atUtc)
    {
        Mode = mode;
        Reason = reason ?? string.Empty;
        HResult = hResult;
        AtUtc = atUtc;
    }

    /// <summary>
    ///     The provider mode now active after the switch.
    /// </summary>
    public AlarmProviderMode Mode { get; }

    /// <summary>
    ///     Human-readable reason for the switch (e.g. the failing COM call, or
    ///     <c>"recovered"</c> for a failback).
    /// </summary>
    public string Reason { get; }

    /// <summary>
    ///     The COM HRESULT that triggered a failover, or 0 when none applies.
    /// </summary>
    public int HResult { get; }

    /// <summary>
    ///     The UTC instant the switch occurred.
    /// </summary>
    public DateTime AtUtc { get; }
}
