using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using Yaulw.Registry;

namespace TCMPortMapper.Helpers
{
    public static class Utility
    {
        /// <summary>
        /// This function uses a Web request to find the external IP Address your machine is using
        /// </summary>
        /// <param name="pTimeOutMiliSeconds">Number of miliseconds to wait for a response</param>
        /// <param name="forceMultipleChecks">Tells if we should attempt to get the external ip in multiple tries</param>
        /// <returns>External facing IP address</returns>
        public static string GetExternalIP(int pTimeOutMiliSeconds, bool forceMultipleChecks)
        {
            var externalIP = Yaulw.Net.IPHostHelper.GetExternalIP(forceMultipleChecks);
            if (externalIP == null || externalIP == IPAddress.None)
                return string.Empty;

            return externalIP.ToString();
        }

        /// <summary>
        /// This function uses a Web request to find the external IP Address your machine is using
        /// </summary>
        /// <param name="pTimeOutMiliSeconds">Number of miliseconds to wait for a response</param>
        /// <returns>External facing IP address</returns>
        public static string GetExternalIP(int pTimeOutMiliSeconds)
        {
            string whatIsMyIp = "http://automation.whatismyip.com/n09230945.asp";
            WebClient wc = new WebClient();
            UTF8Encoding utf8 = new UTF8Encoding();
            try
            {
                string ipaddr = null;
                bool done = false;

                wc.DownloadDataCompleted += new
                DownloadDataCompletedEventHandler((object sender,
                           DownloadDataCompletedEventArgs e) =>
                {
                    ipaddr = utf8.GetString(e.Result);
                    done = true;
                });

                wc.DownloadDataAsync(new Uri(whatIsMyIp));
                System.DateTime startTime = System.DateTime.Now;
                while (!done)
                {
                    System.TimeSpan sp = System.DateTime.Now - startTime;

                    // We should get a response in less than timeout.
                    // If not, we cancel all and return the internal IP Address
                    if (sp.TotalMilliseconds > pTimeOutMiliSeconds)
                    {
                        done = true;
                        wc.CancelAsync();
                    }
                }
                return ipaddr;
            }
            catch
            {
                return null;
            }
            finally
            {
                if (wc != null)
                {
                    wc.Dispose();
                    wc = null;
                }
            }
        }
    }
}
