using System;
using System.Collections.Generic;
using Wayne.Lib;
using Wayne.ForecourtControl.Fusion;
#if _SINP
using Wayne.ForecourtControl.Nfs;
#endif

namespace Wayne.ForecourtControl.Vir.Fusion
{
    internal class FUSIONVirId: IVirId
    {
        // Fields
        private int deviceId;
        private string virId;
        
        // Methods
        public FUSIONVirId(int deviceId, string virId)
        {
            this.deviceId = deviceId;
            this.virId = virId;
        }

        public string Id
        {
            get { return virId; }
        }
    }

    internal class FUSIONVir : IVir //, IDisposable
    {
        // Fields
        private int id;
        List<IVirId> virIdList;
        public FUSIONManager manager;

        // Events
        public event EventHandler<VIRStateChangedEventArgs> OnVirIdStateChange;

        // Methods
        public FUSIONVir(int fcId, int id)
        {
            //Trace.Add(this);
            if (!FUSIONFactory.fusionForecourtControlList.ContainsKey(fcId))
            {
                Trace.WriteLine(string.Format("fusionForecourtControl id={0} NOT exist - creating", fcId));
                FUSIONFactory.CreateForecourtControl(fcId, NoPumpAuthorizationIdGenerator.Instance);
            }

            if (FUSIONFactory.fusionForecourtControlList.ContainsKey(fcId))
            {
                Trace.WriteLine(string.Format("fusionForecourtControl id={0} adding event OnConnectionStateChange", fcId));
                manager = ((FUSIONForecourtControl)(FUSIONFactory.fusionForecourtControlList[fcId])).manager;
                //this.manager.ifsfManager.clientSocket.OnConnectionStateChange += new EventHandler<ConnectionChangedEventArgs>(clientSocket_OnConnectionStateChange); //new EventHandler<ConnectionChangedEventArgs>(this, (IntPtr)this.clientSocket_OnConnectionStateChange);
            }
            else
                Trace.WriteLine(string.Format("fusionForecourtControl id={0} NOT exist - error!!!", fcId));

            this.id = id;
            this.virIdList = new List<IVirId>();
        
            if (manager != null)
                manager.ifsfManager.GetDeviceState(Wayne.FDCPOSLibrary.DeviceType.DT_Vir, id, null, null, null);
        }

        // Properties
        public int Id
        {
            get
            {
                return this.id;
            }
        }

        public System.Collections.ObjectModel.ReadOnlyCollection<IVirId> VirIds
        {
            get { return virIdList.AsReadOnly(); }
        }

        //public void Dispose()
        //{
        //    foreach (FUSIONVirId virId in this.virIdList)
        //    {
        //        virId.Dispose();
        //    }
        //}

        public FUSIONVirId getVirId(string virId)
        {
            foreach (FUSIONVirId virIdElem in virIdList)
            {
                if (virIdElem.Id == virId)
                    return virIdElem;
            }
            return null;
        }

        public DeviceConnectionState State(string virId)
        {
            FUSIONVirId virIdElem = getVirId(virId);
            if (virIdElem != null)
            {
                return DeviceConnectionState.Connected;
            }
            return DeviceConnectionState.Disconnected;
        }

        public void Connected(string virId)
        {
            FUSIONVirId virIdElem = getVirId(virId);
            if (virIdElem == null)
            {
                this.virIdList.Add(new FUSIONVirId(this.Id, virId));
                if (this.OnVirIdStateChange != null)
                {
                    this.OnVirIdStateChange(this, new VIRStateChangedEventArgs(this.Id, virId, DeviceConnectionState.Connected));
                }
                Trace.WriteLine(string.Format("Connected: virId={0} added", virId));
            }
            else
                Trace.WriteLine(string.Format("Connected: virId={0} already connected", virId));
        }

        public void Disconnected(string virId)
        {
            FUSIONVirId virIdElem = getVirId(virId);
            if (virIdElem != null)
            {
                this.virIdList.Remove(virIdElem);
                if (this.OnVirIdStateChange != null)
                {
                    this.OnVirIdStateChange(this, new VIRStateChangedEventArgs(this.Id, virId, DeviceConnectionState.Disconnected));
                }
                Trace.WriteLine(string.Format("Disconnected: virId={0} removed", virId));
            }
            else
                Trace.WriteLine(string.Format("Disconnected: virId={0} not found!", virId));
        }
    }
}