using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Wayne.Lib.StateEngine;
using Wayne.Lib.StateEngine.Generic;

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

        protected override void Enter(StateEntry stateEntry, ref Transition transition)
        {
            base.Enter(stateEntry, ref transition);

            Main.OpenCardReader(out sqNo);
        }

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

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

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