using System;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using Team.Communicate.Data;
using Team.Communicate.EventArg;

namespace Team.Communicate.Interfaces
{ 
    public interface IAsyncTcpClient : IDisposable
    {
        bool IsAutoConnect { get; set; }
        Encoding Encoding { get; set; }
        IPAddress RemoteIpAddress { get; set; }
        int Port { get; }
        bool IsConnected { get; }

        /// <summary>
        /// 连接成功为true
        /// </summary>
        /// 1.exception ArgumentOutOfRangeException
        /// 2.exception ArgumentNullException
        /// <returns></returns>
        bool Connect();
        /// <summary>
        /// 异步连接成功为true
        /// </summary>
        /// 1.exception ArgumentOutOfRangeException
        /// 2.exception ArgumentNullException
        /// <returns></returns>
        Task<bool> ConnectAsync();
        /// <summary>
        /// 异步发送
        ///1.Exception 未连接异常
        /// </summary>
        /// <param name="msg"></param>
        TransmissionResult SendString(string msg);
        /// <summary>
        /// 异步发送
        ///1.Exception 未连接异常
        /// </summary>
        /// <param name="msg"></param>
        Task<TransmissionResult> SendStringAsync(string msg);
        /// <summary>
        /// 发送并接收一个消息
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        string SendAndReceiveString(string msg);
        /// <summary>
        ///  异步发送并接收一个消息
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        Task<string> SendAndReceiveStringAsync(string msg);
        /// <summary>
        /// 设定RemoteIp和端口,如果已经连接并且端口和Ip发送变化将断开连接
        /// </summary>
        /// <param name="ip">ip地址</param>
        /// <param name="port">端口</param>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="FormatException"></exception>
        void SetRemoteIpOrPort(string ip, int port);
        /// <summary>
        /// 异步发送
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        TransmissionResult SendBytes(byte[] data);
       
        /// <summary>
        /// 异步发送
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        Task<TransmissionResult> SendBytesAsync(byte[] data);

        /// <summary>
        /// 异步接收
        /// </summary>
        /// <returns></returns>
        Task<string> ReceiveStringAsync();
        /// <summary>
        /// 异步接收
        /// </summary>
        /// <returns></returns>
        string ReceiveString();
        /// <summary>
        /// 异步接收字节
        /// </summary>
        /// <returns></returns>
        Task<byte[]> ReceiveBytesAsync();
        /// <summary>
        /// 接收字节
        /// </summary>
        /// <returns></returns>
        byte[] ReceiveBytes();

        void DisConnect();
        /// <summary>
        /// tcp状态改变事件
        /// </summary>
        event EventHandler<TcpClientStatusEventArgs> StatusChanged;
        /// <summary>
        /// tcp获取数据事件
        /// </summary>
        event EventHandler<ReceivedEventArgs> Received;

        event EventHandler<SentEventArgs> Sent;
        void Reconnect();
        bool Connecting { get; }
    }
}