using System;
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;
namespace FastGithub.DomainResolve
{
    /// 
    /// IP延时
    /// 
    [DebuggerDisplay("Adddress={Adddress} Elapsed={Elapsed}")]
    struct IPAddressElapsed
    {
        private static readonly TimeSpan maxConnectTimeout = TimeSpan.FromSeconds(5d);
        /// 
        /// 获取IP地址
        /// 
        public IPAddress Adddress { get; }
        /// 
        /// 获取延时
        /// 
        public TimeSpan Elapsed { get; }
        /// 
        /// IP延时
        /// 
        /// 
        /// 
        public IPAddressElapsed(IPAddress adddress, TimeSpan elapsed)
        {
            this.Adddress = adddress;
            this.Elapsed = elapsed;
        }
        /// 
        /// 获取连接耗时
        /// 
        /// 
        /// 
        /// 
        /// 
        public static async Task ParseAsync(IPAddress address, int port, CancellationToken cancellationToken)
        {
            var stopWatch = Stopwatch.StartNew();
            try
            {
                using var timeoutTokenSource = new CancellationTokenSource(maxConnectTimeout);
                using var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutTokenSource.Token);
                using var socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
                await socket.ConnectAsync(address, port, linkedTokenSource.Token);
                return new IPAddressElapsed(address, stopWatch.Elapsed);
            }
            catch (Exception)
            {
                cancellationToken.ThrowIfCancellationRequested();
                return new IPAddressElapsed(address, TimeSpan.MaxValue);
            }
            finally
            {
                stopWatch.Stop();
            }
        }
    }
}