using System.Net;

namespace ZeroLevel.Extensions
{
    public static class EndpointExtensions
    {
        public const string HTTP_SCHEMA = "http";
        public const string HTTPS_SCHEMA = "https";

        public static string ToHttpUrl(this EndPoint endPoint, string schema, string rawUrl = null!)
        {
            if (endPoint is IPEndPoint)
            {
                var ipEndPoint = endPoint as IPEndPoint;
                return CreateHttpUrl(schema, ipEndPoint?.Address?.ToString() ?? string.Empty, ipEndPoint?.Port ?? 0,
                    rawUrl != null ? rawUrl.TrimStart('/') : string.Empty);
            }

            if (endPoint is DnsEndPoint)
            {
                var dnsEndpoint = endPoint as DnsEndPoint;
                return CreateHttpUrl(schema, dnsEndpoint?.Host ?? string.Empty, dnsEndpoint?.Port ?? 0,
                    rawUrl != null ? rawUrl.TrimStart('/') : string.Empty);
            }

            return null!;
        }

        public static string ToHttpUrl(this EndPoint endPoint, string schema, string formatString,
            params object[] args)
        {
            if (endPoint is IPEndPoint)
            {
                var ipEndPoint = endPoint as IPEndPoint;
                return CreateHttpUrl(schema, ipEndPoint?.Address?.ToString() ?? string.Empty, ipEndPoint?.Port ?? 0,
                    string.Format(formatString.TrimStart('/'), args));
            }

            if (endPoint is DnsEndPoint)
            {
                var dnsEndpoint = endPoint as DnsEndPoint;
                return CreateHttpUrl(schema, dnsEndpoint?.Host ?? string.Empty, dnsEndpoint?.Port ?? 0,
                    string.Format(formatString.TrimStart('/'), args));
            }

            return null!;
        }

        private static string CreateHttpUrl(string schema, string host, int port, string path)
        {
            return $"{schema}://{host}:{port}/{path}";
        }
    }
}