using System;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;
using System.Collections;
using System.Collections.Specialized;
using System.Text;


namespace BrunoForecast
{
    public class MyWeatherData 
    {
        private string rawHtml;        // private Global variable to store a copy of returned raw HTML
        private string result;
        private string url;
        public string data;

        public string GetData(string rawHtml)
        {
            Regex regex = new Regex("<div id=\"cnnWeatherForecastCurrentContent\">((.|\n)*?)<div class=\"cnnWireBoxFooter\">",
                                    RegexOptions.IgnoreCase);

            Match oM = regex.Match(rawHtml);
            string newResults = oM.Value;

            string data = GetCurrentTemp(newResults);
            data += GetHi(newResults);
            data += GetLo(newResults);
            data += GetSunrise(newResults);
            data += GetSunset(newResults);
            data += GetBarometer(newResults);
            data += GetWind(newResults);

            return data;
        }

        public static Match[] FindSubstrings(string source,
           string matchPattern, bool findAllUnique)
        {
            SortedList uniqueMatches = new SortedList();
            Match[] retArray = null;
            Regex RE = new Regex(matchPattern, RegexOptions.Multiline);
            MatchCollection theMatches = RE.Matches(source);
            if (findAllUnique)
            {
                for (int counter = 0; counter < theMatches.Count; counter++)
                {
                    if (!uniqueMatches.ContainsKey(theMatches[counter].Value))
                    {
                        uniqueMatches.Add(theMatches[counter].Value,
                        theMatches[counter]);
                    }
                }
                retArray = new Match[uniqueMatches.Count];
                uniqueMatches.Values.CopyTo(retArray, 0);
            }
            else
            {
                retArray = new Match[theMatches.Count];
                theMatches.CopyTo(retArray, 0);
            }
            return (retArray);
        }

        public string GetCurrentTemp(string rawHtml)
        {
            string start_string = "<div class=\"cnnweathertempcurrent\">";
            string matchPattern = start_string + "((.|\n)*?)</div>";

            Match[] x1 = FindSubstrings(rawHtml, matchPattern, false);

            StringBuilder sb = new StringBuilder();

            foreach (Match m in x1)
            {
                sb.Append(m.Value);

            }
            string s = sb.ToString();
            return "<b><font size=\"1\">Current temp: </b>" + s.Substring(start_string.Length, 
                s.IndexOf("&") - start_string.Length) + " degrees</font><br />";

        }
        
        public string GetHi(string rawHtml)
        {

            string start_string = "<b>hi ";
            string matchPattern = start_string + "((.|\n)*?)</div>";
            Match[] x1 = FindSubstrings(rawHtml, matchPattern, false);
            StringBuilder sb = new StringBuilder();

            foreach (Match m in x1)
            {
                sb.Append(m.Value);

            }
            string s = sb.ToString();
            return "<b><font size=\"1\">Hi temp: </b>" + s.Substring(start_string.Length, s.IndexOf("&") - start_string.Length) + " degrees</font><br />";
        }
        
        public string GetLo(string rawHtml)
        {
            string start_string = "<b>lo ";
            string matchPattern = start_string + "((.|\n)*?)</div>";
            Match[] x1 = FindSubstrings(rawHtml, matchPattern, false);
            StringBuilder sb = new StringBuilder();

            foreach (Match m in x1)
            {
                sb.Append(m.Value);

            }
            string s = sb.ToString();
            return "<b><font size=\"1\">Low temp: </b>" + s.Substring(start_string.Length, s.IndexOf("&") - start_string.Length) + " degrees</font><br />";

        }
        
        public string GetSunrise(string rawHtml)
        {
            string matchPattern = "<b>sunrise:((.|\n)*?)<br />";
            Match[] x1 = FindSubstrings(rawHtml, matchPattern, false);
            StringBuilder sb = new StringBuilder();
            int max_count = 0;
            foreach (Match m in x1)
            {
                sb.Append(m.Value);
                if (++max_count == 2)
                    break;

                Console.WriteLine(m.Value);
            }
            return "<font size=\"1\">" + sb.ToString().Replace("</div>", "") + "</font>";

        }
        
        public string GetSunset(string rawHtml)
        {
            string matchPattern = "<b>sunset:((.|\n)*?)<br />";
            Match[] x1 = FindSubstrings(rawHtml, matchPattern, false);
            StringBuilder sb = new StringBuilder();
            foreach (Match m in x1)
            {
                sb.Append(m.Value);
                Console.WriteLine(m.Value);
            }
            return "<font size=\"1\">" + sb.ToString().Replace("</div>", "") + "</font>";
        }
        
        public string GetBarometer(string rawHtml)
        {
            string matchPattern = "<b>barometer:((.|\n)*?)<br />";
            Match[] x1 = FindSubstrings(rawHtml, matchPattern, false);
            StringBuilder sb = new StringBuilder();
            foreach (Match m in x1)
            {
                sb.Append(m.Value);
                Console.WriteLine(m.Value);
            }
            return "<font size=\"1\">" + sb.ToString().Replace("</div>", "") + "</font>";
        }
        
        public string GetWind(string rawHtml)
        {
            string matchPattern = "<b>wind:((.|\n)*?)</div>";
            Match[] x1 = FindSubstrings(rawHtml, matchPattern, false);
            StringBuilder sb = new StringBuilder();
            foreach (Match m in x1)
            {
                sb.Append(m.Value);
                Console.WriteLine(m.Value);
            }
            return "<font size=\"1\">" + sb.ToString().Replace("</div>", "") + "</font>";

        }
        
        public string GetHtml()
        {
            return data;
        }
        
        
        public MyWeatherData(string city, string zip)
        {
            url = "http://weather.cnn.com/weather/forecast.jsp?locCode=" + city + "&zipCode=" + zip;
            WebRequest objRequest = HttpWebRequest.Create(url);
            WebResponse objResponse = objRequest.GetResponse();
            Stream stream = objResponse.GetResponseStream();
            StreamReader sr = new StreamReader(stream);
            result = sr.ReadToEnd();
            rawHtml = result.ToLower();

            data = GetData(rawHtml);
            objResponse.Close();



        }
        public void Show()
        {
            Console.Write("The result is " + result);
        }

    }

}