using System.Net.NetworkInformation;

namespace InnovEnergy.Lib.Utils.Net;

public static class NetUtils
{
    public static Int32 GetAvailableTcpPort()
    {
        const Int32 minPort = 1024;

        var ipProps = IPGlobalProperties.GetIPGlobalProperties();

        var tcpConnections = ipProps
                            .GetActiveTcpConnections()
                            .Select(c => c.LocalEndPoint.Port)
                            .Where(p => p >= minPort);

        var tcpListeners = ipProps
                          .GetActiveTcpListeners()
                          .Select(c => c.Port)
                          .Where(p => p >= minPort);

        var usedPorts = tcpConnections
                       .Concat(tcpListeners)
                       .ToHashSet();

        return Enumerable
              .Range(minPort, UInt16.MaxValue - minPort)
              .Unless(usedPorts.Contains)
              .First();
    }
}