using System;
using System.Threading;
using Wayne.ForecourtControl;
using Wayne.ForecourtControl.Fusion;
using Wayne.Lib;

namespace TestRun
{
    class Program
    {
        static NLog.Logger mainLogger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("Main");
        static string DEFAULT_FDC_SERVER_CONNECT_STRING = "Host=192.168.50.238,Port=4711,ClientId=101,ClientName=PetroChinaProxy,PortB=4711,PortC=4711";
        static IForecourtControl forecourtControl;
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            var concreteFdcServerConnString = DEFAULT_FDC_SERVER_CONNECT_STRING.Replace("127.0.0.1", "127.0.0.1")
                .Replace("ClientId=101", "ClientId=" + "109");
            forecourtControl = Wayne.ForecourtControl.Fusion.FUSIONFactory.CreateForecourtControl(0);
            forecourtControl.OnConnectionStateChange += forecourtControl_OnConnectionStateChange;
            forecourtControl.Connect(concreteFdcServerConnString);
            while (true)
                Console.ReadLine();
        }

        static void forecourtControl_OnConnectionStateChange(object sender, ConnectionChangedEventArgs e)
        {
            mainLogger.Debug("forecourtControl_OnConnectionStateChange(), new state: " + e.ConnectionState);
            if (e.ConnectionState == Wayne.Lib.DeviceConnectionState.Disconnected)
            {
                Console.WriteLine("Disconnected to FC!");
                foreach (var pump in forecourtControl.Pumps)
                {
                    pump.OnFuellingStateChange -= FdcCommunicator_OnFuellingStateChange;
                    pump.OnNozzleStateChange -= FdcCommunicator_OnNozzleStateChange;
                    pump.OnEventOccured -= FdcCommunicator_OnEventOccured;
                }
            }
            else if (e.ConnectionState == Wayne.Lib.DeviceConnectionState.Connected)
            {
                var fc = forecourtControl as FUSIONForecourtControl;
                //fc.manager.ifsfManager.LogOnSend("pos119");
                fc.manager.ifsfManager.GetDSPConfiguration((a, b) =>
                {
                    Console.Write("GetDSPConfiguration response");
                }, 111, 111);
                // sometimes could not receive any notification from FDC server even attached the event handler, 
                // suspect some underlying bug in communication layer, so here try sleep a while to avoid(probably) this.
                //
                Thread.Sleep(500);
                Console.WriteLine("Connected to FC!");
                foreach (var pump in forecourtControl.Pumps)
                {
                    pump.OnFuellingStateChange += FdcCommunicator_OnFuellingStateChange;
                    pump.OnNozzleStateChange += FdcCommunicator_OnNozzleStateChange;
                    pump.OnEventOccured += FdcCommunicator_OnEventOccured;
                }

                //forecourtControl.SetSiteOpenedAsync(true, (_, __) => { }, null);
            }
        }

        private static void FdcCommunicator_OnEventOccured(object sender, PumpEventOccuredEventArgs e)
        {
            Console.WriteLine("fdc on event occured: " + e.EventType);
        }

        private static void FdcCommunicator_OnNozzleStateChange(object sender, NozzleStateChangeEventArgs e)
        {
            var pump = sender as IPump;
            Console.WriteLine("fdc OnNozzleStateChange, pump: " + pump.Id + ", nozzle: " + e.Nozzle.Id + ", nozzle state: " + e.NozzleState);
        }

        private static void FdcCommunicator_OnFuellingStateChange(object sender, FuellingStateChangeEventArgs e)
        {
            var pump = sender as IPump;
            Console.WriteLine("fdc OnFuellingStateChange, pump: " + pump.Id + ", nozzle: " + e.Fuelling.Nozzle.Id
                + ", nozzle state: " + e.State + ", amt: " + e.Fuelling.Amount + ", qty: " + e.Fuelling.Quantity
                + ", price: " + e.Fuelling.Price + ", seqNo.: " + e.Fuelling.FuellingSequenceNumber);
        }
    }
}