using ZB.MOM.WW.MxGateway.Contracts.Proto;
using ZB.MOM.WW.ScadaBridge.DataConnectionLayer.Adapters;
using CommonsTransitionKind = ZB.MOM.WW.ScadaBridge.Commons.Types.Enums.AlarmTransitionKind;
using ProtoConditionState = ZB.MOM.WW.MxGateway.Contracts.Proto.AlarmConditionState;
using ProtoTransitionKind = ZB.MOM.WW.MxGateway.Contracts.Proto.AlarmTransitionKind;

namespace ZB.MOM.WW.ScadaBridge.DataConnectionLayer.Tests;

/// <summary>Task-12: pure MxGateway alarm-feed proto → NativeAlarmTransition mapping.</summary>
public class MxGatewayAlarmMapperTests
{
    [Fact]
    public void MapTransition_AckTransition_IsAcknowledgedWithOperator()
    {
        var ev = new OnAlarmTransitionEvent
        {
            AlarmFullReference = "Tank01.Level.HiHi",
            SourceObjectReference = "Tank01",
            AlarmTypeName = "AnalogLimitAlarm.HiHi",
            TransitionKind = ProtoTransitionKind.Acknowledge,
            Severity = 600,
            OperatorUser = "operator1",
            OperatorComment = "ack",
            Category = "Process",
            Description = "hi"
        };

        var t = MxGatewayAlarmMapper.MapTransition(ev);

        Assert.Equal(CommonsTransitionKind.Acknowledge, t.Kind);
        Assert.True(t.Condition.Active);
        Assert.True(t.Condition.Acknowledged);
        Assert.Equal(600, t.Condition.Severity);
        Assert.Equal("operator1", t.OperatorUser);
        Assert.Equal("Tank01", t.SourceObjectReference);
    }

    [Fact]
    public void MapConditionState_ActiveAcked_To_ActiveTrue_AckTrue()
    {
        var c = MxGatewayAlarmMapper.MapConditionState(ProtoConditionState.ActiveAcked, severity: 600);
        Assert.True(c.Active);
        Assert.True(c.Acknowledged);
        Assert.Equal(600, c.Severity);
    }

    [Fact]
    public void MapSnapshot_ActiveUnacked_IsSnapshotKind()
    {
        var snap = new ActiveAlarmSnapshot
        {
            AlarmFullReference = "Tank01.Level.Hi",
            SourceObjectReference = "Tank01",
            AlarmTypeName = "AnalogLimitAlarm.Hi",
            CurrentState = ProtoConditionState.Active,
            Severity = 1500 // out of range — must clamp
        };

        var t = MxGatewayAlarmMapper.MapSnapshot(snap);

        Assert.Equal(CommonsTransitionKind.Snapshot, t.Kind);
        Assert.True(t.Condition.Active);
        Assert.False(t.Condition.Acknowledged);
        Assert.Equal(1000, t.Condition.Severity);
    }
}
