using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
namespace FastGithub.Configuration
{
    /// 
    /// 提供本机设备信息
    /// 
    public static class LocalMachine
    {
        /// 
        /// 获取设备名
        /// 
        public static string Name => Environment.MachineName;
        /// 
        /// 获取设备所有IP
        /// 
        /// 
        public static IEnumerable GetAllIPAddresses()
        {
            yield return IPAddress.Loopback;
            yield return IPAddress.IPv6Loopback;
            foreach (var @interface in NetworkInterface.GetAllNetworkInterfaces())
            {
                foreach (var addressInfo in @interface.GetIPProperties().UnicastAddresses)
                {
                    yield return addressInfo.Address;
                }
            }
        }
        /// 
        /// 获取设备所有IPv4
        /// 
        /// 
        public static IEnumerable GetAllIPv4Addresses()
        {
            foreach (var address in GetAllIPAddresses())
            {
                if (address.AddressFamily == AddressFamily.InterNetwork)
                {
                    yield return address;
                }
            }
        }
        /// 
        /// 返回设备是否包含指定IP
        /// 
        /// 
        /// 
        public static bool ContainsIPAddress(IPAddress address)
        {
            return GetAllIPAddresses().Contains(address);
        }
        /// 
        /// 获取对应的本机地址
        /// 
        /// 远程地址
        /// 
        public static IPAddress? GetLocalAddress(EndPoint remoteEndPoint)
        {
            try
            {
                using var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                socket.Connect(remoteEndPoint);
                return socket.LocalEndPoint is IPEndPoint localEndPoint ? localEndPoint.Address : default;
            }
            catch (Exception)
            {
                return default;
            }
        }
    }
}