using System.Collections.Generic;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
namespace WeatherConsoleApp
public abstract class AForecast
public abstract void RunForecast();
public abstract class AWeatherFactory
public abstract AForecast CreateForecast(string ForecastType);
public string City { get; set; }
public string[] ForecastDate { get; set; }
public double[] DailyForecast { get; set; }
this.DailyForecast = null;
this.ForecastDate = null;
public class SummaryWeatherData
public string City { get; set; }
public string ForecastDate { get; set; }
public double AvgDailyTemperature { get; set; }
public bool ChanceOfPrecipitation { get; set; }
public SummaryWeatherData()
this.AvgDailyTemperature = 0.0;
this.ChanceOfPrecipitation = false;
public class WeeklyForecast : AForecast
private string[] _citiesArr;
public WeeklyForecast(string[] Cities, string ApiUrl)
this._citiesArr = Cities;
private void WriteWeatherData(List<SummaryWeatherData> ListSummaryWeatherData)
foreach (SummaryWeatherData wd in ListSummaryWeatherData)
Console.WriteLine("City: " + wd.City);
Console.WriteLine("Date\t" + "Avg Daily Temp (F)");
Console.WriteLine("-----------------------------------------");
Console.Write(wd.ForecastDate);
if (wd.ChanceOfPrecipitation)
double avgDailyTemperature = Math.Round(wd.AvgDailyTemperature, 2, MidpointRounding.AwayFromZero);
Console.WriteLine("\t" + avgDailyTemperature);
public override void RunForecast()
Console.WriteLine("in RunForecast");
string[] _cities = { "Marlboro, MA", "San Diego, CA", "Cheyenne, WY", "Anchorage, AK", "Austin, TX", "Orlando, FL" };
this._citiesArr = _cities;
Console.WriteLine("this._citiesArr = " + this._citiesArr[0]);
this._apiUrl = "http://api.openweathermap.org/data/2.5/forecast?APPID=0e9a405a63512aa14a836dad6b59ce8c&units=imperial&q=";
if (this._citiesArr == null)
Console.WriteLine("Error: No cities specified in the config");
if (this._apiUrl == null)
Console.WriteLine("Error: The openWeather APi is not specified in the config");
Console.WriteLine("this._apiUrl = " + this._apiUrl);
List<SummaryWeatherData> listSummaryCityWeatherData = new List<SummaryWeatherData>();
StringBuilder url = null;
WeatherData objWeatherData = null;
bool chanceOfPrecip = false;
double fahrenheitTemperature;
for (int i=0; i<this._citiesArr.Length; i++)
string city = this._citiesArr[i];
objWeatherData = new WeatherData();
objWeatherData.City = city;
url = new StringBuilder(this._apiUrl + city);
Console.WriteLine("url = " + url);
HttpClient weeklyClient = new HttpClient();
weeklyClient.Timeout = TimeSpan.FromMinutes(2);
var response = weeklyClient.GetAsync(url.ToString()).GetAwaiter().GetResult();
var result = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
obj = JObject.Parse(result);
jsonRoot = JsonConvert.DeserializeObject(result);
numListItems = jsonRoot.list.Count;
objWeatherData.ForecastDate = new string[numListItems];
objWeatherData.DailyForecast = new double[numListItems];
foreach (var data in jsonRoot.list)
SummaryWeatherData objSummaryCityWeatherData = new SummaryWeatherData();
objSummaryCityWeatherData.City = city;
curDate = (string)data.dt_txt;
dt = DateTime.Parse(curDate);
curDate2 = dt.ToString("yyyyMMdd");
objWeatherData.ForecastDate[numItems] = curDate2;
if (data.rain != null || data.snow != null)
foreach (var listItem in data.main)
if (listItem.Name == "temp")
fahrenheitTemperature = (double)listItem.Value;
objWeatherData.DailyForecast[numItems] = fahrenheitTemperature;
totalTemp += objWeatherData.DailyForecast[numItems];
else if (numItems > 0 && objWeatherData.ForecastDate[numItems] == objWeatherData.ForecastDate[numItems - 1])
totalTemp += objWeatherData.DailyForecast[numItems];
else if (numItems > 0 && objWeatherData.ForecastDate[numItems] != objWeatherData.ForecastDate[numItems - 1])
objSummaryCityWeatherData.AvgDailyTemperature = totalTemp / numDays;
objSummaryCityWeatherData.ForecastDate = objWeatherData.ForecastDate[numItems - 1];
objSummaryCityWeatherData.ChanceOfPrecipitation = true;
listSummaryCityWeatherData.Add(objSummaryCityWeatherData);
objSummaryCityWeatherData = null;
totalTemp = objWeatherData.DailyForecast[numItems];
this.WriteWeatherData(listSummaryCityWeatherData);
public class WeatherFactory : AWeatherFactory
public override AForecast CreateForecast(string ForecastType)
switch (ForecastType.ToLower())
WeeklyForecast objWeeklyForecast = new WeeklyForecast();
return (objWeeklyForecast);
WeeklyForecast objDefaultForecast = new WeeklyForecast();
return (objDefaultForecast);
public class WeatherConsoleClient
public static void Main(string[] args)
Console.WriteLine("calling WeatherFactory");
WeatherFactory objWeatherFactory = new WeatherFactory();
AForecast objForecast = objWeatherFactory.CreateForecast("weeklyforecast");
objForecast.RunForecast();
Console.WriteLine("after RunForecast");
Console.WriteLine("Successfuly converted temperatures.");
Console.WriteLine("Exception thrown: " + e.Message);