using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Xml.Serialization;
using Wayne.Lib.StateEngine;
using Wayne.Lib.StateEngine.Generic;

namespace SinochemInternetPlusApp.States
{
    public class SendWelcomeScreen : TimeoutState<FuelingPoint>
    {
        private byte sqNo;
        private bool bigScreenReplied = false;
        private int? requestId;

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

            //Main.CurrentEpsTrx.UpdateTrxStatusToDb(EpsTrxStatus.BeforeFueling);

            bigScreenReplied = false;

            DebugLog($"为车牌号: {Main.NewEpsTrx.Model.car_number}, 卡号: {Main.NewEpsTrx.Model.card_no} 发送欢迎屏幕");

            //Don't need send rquest to BigScreen
            if (!Main.HasBigSreen())
            {
                transition = new Transition(this, TransitionType.Done);
                return;
            }
            if (Main.Eps.CarPlateHandler != null)
            {
                string text = CreateDisplayWelcomeCommand(Main.NewEpsTrx.Model);
                DebugLog(text);
                Main.Eps.CarPlateHandler.BroadcastMessageViaFdc(text);

                if (requestId.HasValue)
                {
                    DebugLog($"Adding RequestId: {requestId.Value} in SendWelcomeScreen Enter");
                    Main.AddRequestId(requestId.Value);
                }    
            }
        }

        protected override void HandleNonTimeoutEvent(StateEngineEvent stateEngineEvent, ref Transition transition)
        {
            if (stateEngineEvent.Type.Equals(EventType.DisplayResponseReceived))
            {
                var e = stateEngineEvent as GenericEvent<DisplayResponseEventArgs>;
                if (e != null && e.EventArgs != null)
                {
                    if (requestId.HasValue && requestId.Value == e.EventArgs.DispResponse.RequestId)
                    {
                        e.Handled = true;
                        bigScreenReplied = true;

                        if (Main.ContainsRequestId(requestId.Value))
                        {
                            DebugLog($"Removed RequestId: {requestId.Value} from the list");
                            Main.RemoveRequestId(requestId.Value);
                        }
                    }
                }
            }
            else if (stateEngineEvent.Type.Equals(EventType.NozzleLifted))
            {
                transition = new Transition(this, TransitionType.Done);
            }
            if (bigScreenReplied)
            {
                transition = new Transition(this, TransitionType.Done);
                System.Threading.Thread.Sleep(2 * 1000);
            }
        }

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

        protected override int TimeoutInterval =>
            TimeoutValues.GetValueInMilliSec(TimeoutValues.FuelingPoint.CarPlateMode_SendWelcomeScreen, 20);

        private string CreateDisplayWelcomeCommand(EpsTransactionModel epsTrxModel)
        {
            Display display;
            string cmdText = "";
            XmlSerializer serializer = new XmlSerializer(typeof(Display));
            MemoryStream ms;
            StreamReader sr;

            display = new Display();
            display.ScreenType = ScreenType.Welcome;
            display.RequestId = Main.Eps.GetNextRequestId();
            requestId = display.RequestId;

            display.MemberInfo = new DisplayMemberInfo
            {
                LicensePlateNo = epsTrxModel.car_number,
                Id = "" // empty for now
            };

            display.PumpInfo = new DisplayPumpInfo
            {
                Id = 1,
                NozzleId = epsTrxModel.jihao,
                GradeName = epsTrxModel.youpin
            };

            ms = new MemoryStream();
            serializer.Serialize(ms, display);

            ms.Position = 0;
            sr = new StreamReader(ms, true);
            cmdText = sr.ReadToEnd();
            ms.Close();
            sr.Close();

            return cmdText;
        }
    }
}