using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Edge.Core.Parser.BinaryParser.MessageEntity;
using Edge.Core.Parser;
using Edge.Core.Processor;
using Edge.Core.IndustryStandardInterface.Pump;
using Edge.Core.Processor.Communicator;

namespace Edge.Core.Processor
{
    public interface IContext<TRaw, TMessage> : IDisposable where TMessage : MessageBase
    {
        //event EventHandler OnCommunicatorConnected;
        IDeviceProcessor<TRaw, TMessage> Processor { get; }
        IDeviceHandler<TRaw, TMessage> Handler { get; }
        ICommunicator<TRaw, TMessage> Communicator { get; }

        IIncoming<TMessage> Incoming { get; }
        IOutgoing<TRaw, TMessage> Outgoing { get; }
    }

    //public interface IBinaryContext<TMessage> : IContext<byte[], TMessage>
    //{
    //    IHandler<TMessage> Handler { get; }
    //    IDeviceProcessor<byte[], TMessage> Processor { get; }

    //    Incoming<byte[], TMessage> Incoming { get; }
    //    Outgoing<byte[], TMessage> Outgoing { get; }
    //}

    public class Context<TRaw, TMessage> : IContext<TRaw, TMessage> where TMessage : MessageBase
    {
        //public event EventHandler OnCommunicatorConnected;
        //public event EventHandler OnCommunicatorDisconnected;
        public IDeviceProcessor<TRaw, TMessage> Processor { get; }
        public IDeviceHandler<TRaw, TMessage> Handler { get; }

        public ICommunicator<TRaw, TMessage> Communicator { get; }

        public IIncoming<TMessage> Incoming { get; }

        public IOutgoing<TRaw, TMessage> Outgoing { get; }

        public Context(IDeviceProcessor<TRaw, TMessage> processor, IDeviceHandler<TRaw, TMessage> handler, ICommunicator<TRaw, TMessage> communicator, IIncoming<TMessage> incoming, IOutgoing<TRaw, TMessage> outgoing)
        {
            this.Processor = processor;
            this.Communicator = communicator;
            this.Incoming = incoming;// new HistoryKeepIncoming<TMessage>(10);
            this.Outgoing = outgoing;// new Outgoing<TRaw, TMessage>(this);
            this.Handler = handler;
        }

        public void Dispose()
        {
            if (this.Incoming is IDisposable idp)
                idp.Dispose();
            if (this.Outgoing is IDisposable odp)
                odp.Dispose();
        }
    }

    //public class HttpStringContext<TMessage> : IContext<TMessage> where TMessage : MessageBase
    //{
    //    public event EventHandler OnCommunicatorConnected;
    //    public event EventHandler OnCommunicatorDisconnected;
    //    public IHandler<TMessage> Handler { get; }

    //    //public IDeviceProcessor<byte[], TMessage> Processor { get; }

    //    public Incoming<TMessage> Incoming { get; }

    //    public Outgoing<TMessage> Outgoing { get; }

    //    public HttpStringContext(IHandler<TMessage> handler, ICommunicator<string, TMessage> communicator, IDeviceProcessor<string, TMessage> processor)
    //    {
    //        this.Incoming = new HistoryKeepIncoming<TMessage>(10);
    //        this.Outgoing = new Outgoing<TMessage>(this);
    //        this.Handler = handler;
    //        communicator.OnConnected += (a, b) =>
    //        {
    //            var s = this.OnCommunicatorConnected;
    //            s?.Invoke(this, null);
    //        };
    //        communicator.OnDisconnected += (a, b) =>
    //        {
    //            var s = this.OnCommunicatorDisconnected;
    //            s?.Invoke(this, null);
    //        };
    //    }
    //}
}