using System;
using System.Collections.Generic;
using Wayne.Lib;
using Wayne.Lib.StateEngine;
using Wayne.Lib.StateEngine.Generic;

namespace SinochemInternetPlusApp.States.CarPlateMode
{
    class DisableICCardReader : TimeoutState<FuelingPoint>
    {
        private byte sqNo;

        protected override void Enter(StateEntry stateEntry, ref Transition transition)
        {
            base.Enter(stateEntry, ref transition);
            //transition = new Transition(this, TransitionType.ICCardReaderDisabled);
            //return;
            Main.CloseICCardReader(out sqNo);
        }

        protected override void HandleNonTimeoutEvent(StateEngineEvent stateEngineEvent, ref Transition transition)
        {
            GenericEvent<CardReaderAckEventArgs> ackEvent = stateEngineEvent as GenericEvent<CardReaderAckEventArgs>;
            if (ackEvent != null && ackEvent.EventArgs != null)
            {
                if (ackEvent.EventArgs.Ack.MessageSeqNumber == sqNo)
                {
                    DebugLog($"Ack for previous req arrived, SqNo: {sqNo}");
                    Main.CardReaderDisabled = true;
                    ackEvent.Handled = true;
                    transition = new Transition(this, TransitionType.ICCardReaderDisabled);
                }
                else
                {
                    DebugLog($"SqNo not matched, Sent: {sqNo}, Received: {ackEvent.EventArgs.Ack.MessageSeqNumber}");
                    Main.CardReaderDisabled = true;
                    ackEvent.Handled = true;
                    transition = new Transition(this, TransitionType.ICCardReaderDisabled);
                }
            }
        }

        protected override void Timeout(ref Transition transition)
        {
            transition = new Transition(this, TransitionType.Timeout);
        }

        protected override int TimeoutInterval =>
            TimeoutValues.GetValueInMilliSec(TimeoutValues.FuelingPoint.CarPlateMode_DisableICCardReader, 10);
    }
}