using System;
using System.Threading.Tasks;
using Team.Communicate.EventArg;
using Team.Communicate.Interfaces;

namespace Team.Communicate.Client
{
    /// <summary>
    ///     基础的协议连接类
    /// </summary>
    public abstract class BaseConnector : BaseConnector<byte[], byte[]>
    {
    }

    /// <summary>
    ///     基础的协议连接类
    /// </summary>
    public abstract class BaseConnector<TParamIn, TParamOut> : IConnector<TParamIn, TParamOut>
    {
        /// <summary>
        ///     标识Connector的连接关键字
        /// </summary>
        public abstract string ConnectionToken { get; }

        /// <summary>
        ///     是否处于连接状态
        /// </summary>
        public abstract bool IsConnected { get; }

        /// <summary>
        ///     连接PLC
        /// </summary>
        /// <returns>是否连接成功</returns>
        public abstract bool Connect();

        /// <summary>
        ///     连接PLC,异步
        /// </summary>
        /// <returns>是否连接成功</returns>
        public abstract Task<bool> ConnectAsync();

        /// <summary>
        ///     断开PLC
        /// </summary>
        /// <returns>是否断开成功</returns>
        public abstract bool Disconnect();

        /// <summary>
        ///     无返回发送数据
        /// </summary>
        /// <param name="message">需要发送的数据</param>
        /// <returns>是否发送成功</returns>
        public abstract bool SendMsgWithoutReturn(TParamIn message);

        /// <summary>
        ///     无返回发送数据
        /// </summary>
        /// <param name="message">需要发送的数据</param>
        /// <returns>是否发送成功</returns>
        public abstract Task<bool> SendMsgWithoutReturnAsync(TParamIn message);

        /// <summary>
        ///     带返回发送数据
        /// </summary>
        /// <param name="message">需要发送的数据</param>
        /// <returns>是否发送成功</returns>
        public abstract TParamOut SendMsg(TParamIn message);

        /// <summary>
        ///     带返回发送数据
        /// </summary>
        /// <param name="message">需要发送的数据</param>
        /// <returns>是否发送成功</returns>
        public abstract Task<TParamOut> SendMsgAsync(TParamIn message);

        public abstract event EventHandler<string> SendEventHandler;
        public abstract event EventHandler<ExceptionEventArgs<Exception>> SendExceptionEventHandler;
        public abstract event EventHandler<string> ConnectedEventHandler;
        public abstract event EventHandler<ExceptionEventArgs<Exception>> ConnectExceptionEventHandler;
        public abstract event EventHandler<string> ReceiveEventHandler;
        public abstract event EventHandler<ExceptionEventArgs<Exception>> ReceiveExceptionEventHandler;
        public abstract event EventHandler<string> DisConnectEvent;
        public abstract event EventHandler<ExceptionEventArgs<Exception>> DisConnectFailEvent;
    }
}