#if !NETFX_CORE

using System;
using System.Net.Sockets;
using System.Threading.Tasks;

namespace Plane.Communication
{
    /// <summary>
    /// 提供作为 TCP 客户端通信的能力。
    /// </summary>
    public class TcpConnection : TcpConnectionBase
    {
        private string _remoteHostname;

        private int _remotePort;

        public TcpConnection(string remoteHostname, int remotePort = 5250)
        {
            _remoteHostname = remoteHostname;
            _remotePort = remotePort;
            _client = new TcpClient
            {
                ReceiveBufferSize = 40 * 1024,
                ReceiveTimeout = 1200
            };
        }

        public void Open()
        {
            if (!IsOpen)
            {
                try
                {
                    _client.Connect(_remoteHostname, _remotePort);
                }
                catch (SocketException)
                {
                    CreateClientAndConnect();
                }
                catch (ObjectDisposedException)
                {
                    CreateClientAndConnect();
                }
                _isBroken = false;
            }
            _stream = _client.GetStream();
        }

        public override async Task OpenAsync()
        {
            if (!IsOpen)
            {
                try
                {
                    await _client.ConnectAsync(_remoteHostname, _remotePort).ConfigureAwait(false);
                }
                catch (SocketException)
                {
                    await CreateClientAndConnectAsync();
                }
                catch (ObjectDisposedException)
                {
                    await CreateClientAndConnectAsync();
                }
                _isBroken = false;
            }
            _stream = _client.GetStream();
        }

        private void CreateClientAndConnect()
        {
            _client = new TcpClient(_remoteHostname, _remotePort)
            {
                ReceiveBufferSize = 40 * 1024,
                ReceiveTimeout = 1200
            };
        }

        private async Task CreateClientAndConnectAsync()
        {
            _client = new TcpClient
            {
                ReceiveBufferSize = 40 * 1024,
                ReceiveTimeout = 1200
            };
            await _client.ConnectAsync(_remoteHostname, _remotePort).ConfigureAwait(false);
        }
    }
}

#endif
