using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Net;
using System.Xml.Linq;
using System.IO;
using System.Globalization;

namespace Disco.Web.Models.InitialConfig
{
    public class WelcomeModel
    {
        [Required(ErrorMessage="The Organisation Name is required.")]
        public string OrganisationName { get; set; }


        private static string _OrganisationNameCache;
        public bool AutodetectOrganisation()
        {
            if (_OrganisationNameCache != null)
            {
                this.OrganisationName = _OrganisationNameCache;
                return true;
            }

            // DnsQuery for broadband.doe.wan
            IPHostEntry doeWanDnsEntry;
            try
            {
                doeWanDnsEntry = Dns.GetHostEntry("broadband.doe.wan");
            }
            catch (Exception)
            { return false; } // Fail on error

            // Try using IPSearch feature
            XDocument doeWanIPSearchResult = TryDownloadDoeIPSearch(true);
            if (doeWanIPSearchResult == null)
                doeWanIPSearchResult = TryDownloadDoeIPSearch(false);

            if (doeWanIPSearchResult == null)
                return false;

            try
            {
                var siteName = doeWanIPSearchResult.Element("resultset").Element("site").Element("name").Value.ToLower();
                this.OrganisationName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(siteName);
                _OrganisationNameCache = this.OrganisationName;
                return true;
            }
            catch (Exception)
            { return false; } // Fail on error
        }
        private XDocument TryDownloadDoeIPSearch(bool useProxy)
        {
            try
            {
                HttpWebRequest wReq = (HttpWebRequest)HttpWebRequest.Create("http://broadband.doe.wan/ipsearch/showresult.php");
                // Added: 2013-02-08 G#
                // Fix for Proxy Servers which dont support KeepAlive
                wReq.KeepAlive = false;
                // End Added: 2013-02-08 G#
                if (!useProxy)
                    wReq.Proxy = new WebProxy(); // Empty Proxy Config
                wReq.Method = WebRequestMethods.Http.Post;
                wReq.ContentType = "application/x-www-form-urlencoded";
                wReq.UserAgent = string.Format("Disco/{0}", DiscoApplication.Version);
                using (var wrStream = wReq.GetRequestStream())
                {
                    using (var wrStreamWriter = new StreamWriter(wrStream))
                    {
                        wrStreamWriter.Write("mode=whoami");
                    }
                }
                using (HttpWebResponse wRes = (HttpWebResponse)wReq.GetResponse())
                {
                    if (wRes.StatusCode == HttpStatusCode.OK)
                    {
                        using (var wResStream = wRes.GetResponseStream())
                        {
                            return XDocument.Load(wResStream);
                        }
                    }
                    else
                        return null;
                }
            }
            catch (Exception)
            { return null; } // Fail on error
        }

    }
}