/// <summary>
        /// Look up the six hour forecast using Accuweather.
        /// </summary>
        private async Task <DialogTurnResult> GetWeatherResponse(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            var state = await _stateAccessor.GetAsync(stepContext.Context);

            var service = new AccuweatherService(Settings);

            if (!string.IsNullOrEmpty(state.Geography))
            {
                state.GeographyLocation = await service.GetLocationByQueryAsync(state.Geography);
            }
            else if (!double.IsNaN(state.Latitude))
            {
                state.GeographyLocation = await service.GetLocationByGeoAsync(state.Latitude, state.Longitude);
            }
            else
            {
                throw new Exception("Must have Geography or Latitude & Longitude!");
            }

            var oneDayForecast = await service.GetOneDayForecastAsync(state.GeographyLocation.Key);

            var twelveHourForecast = await service.GetTwelveHourForecastAsync(state.GeographyLocation.Key);

            var hourlyForecasts = new List <HourDetails>();

            bool useFile = Channel.GetChannelId(stepContext.Context) == Channels.Msteams;

            for (int i = 0; i < 6; i++)
            {
                hourlyForecasts.Add(new HourDetails()
                {
                    Hour        = twelveHourForecast[i].DateTime.ToString("hh tt", CultureInfo.InvariantCulture),
                    Icon        = GetWeatherIcon(twelveHourForecast[i].WeatherIcon, useFile),
                    Temperature = Convert.ToInt32(twelveHourForecast[i].Temperature.Value)
                });
            }

            var forecastModel = new SixHourForecastCard()
            {
                Speak              = oneDayForecast.DailyForecasts[0].Day.ShortPhrase,
                Location           = state.GeographyLocation.LocalizedName,
                DayIcon            = GetWeatherIcon(oneDayForecast.DailyForecasts[0].Day.Icon, useFile),
                Date               = $"{oneDayForecast.DailyForecasts[0].Date.DayOfWeek} {CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(oneDayForecast.DailyForecasts[0].Date.Month)} {oneDayForecast.DailyForecasts[0].Date.Day}",
                MinimumTemperature = Convert.ToInt32(oneDayForecast.DailyForecasts[0].Temperature.Minimum.Value),
                MaximumTemperature = Convert.ToInt32(oneDayForecast.DailyForecasts[0].Temperature.Maximum.Value),
                ShortPhrase        = oneDayForecast.DailyForecasts[0].Day.ShortPhrase,
                WindDescription    = $"Winds {oneDayForecast.DailyForecasts[0].Day.Wind.Speed.Value} {oneDayForecast.DailyForecasts[0].Day.Wind.Speed.Unit} {oneDayForecast.DailyForecasts[0].Day.Wind.Direction.Localized}",
                Hour1              = twelveHourForecast[0].DateTime.ToString("h tt", CultureInfo.InvariantCulture),
                Icon1              = GetWeatherIcon(twelveHourForecast[0].WeatherIcon, useFile),
                Temperature1       = Convert.ToInt32(twelveHourForecast[0].Temperature.Value),
                Hour2              = twelveHourForecast[1].DateTime.ToString("h tt", CultureInfo.InvariantCulture),
                Icon2              = GetWeatherIcon(twelveHourForecast[1].WeatherIcon, useFile),
                Temperature2       = Convert.ToInt32(twelveHourForecast[1].Temperature.Value),
                Hour3              = twelveHourForecast[2].DateTime.ToString("h tt", CultureInfo.InvariantCulture),
                Icon3              = GetWeatherIcon(twelveHourForecast[2].WeatherIcon, useFile),
                Temperature3       = Convert.ToInt32(twelveHourForecast[2].Temperature.Value),
                Hour4              = twelveHourForecast[3].DateTime.ToString("h tt", CultureInfo.InvariantCulture),
                Icon4              = GetWeatherIcon(twelveHourForecast[3].WeatherIcon, useFile),
                Temperature4       = Convert.ToInt32(twelveHourForecast[3].Temperature.Value),
                Hour5              = twelveHourForecast[4].DateTime.ToString("h tt", CultureInfo.InvariantCulture),
                Icon5              = GetWeatherIcon(twelveHourForecast[4].WeatherIcon, useFile),
                Temperature5       = Convert.ToInt32(twelveHourForecast[4].Temperature.Value),
                Hour6              = twelveHourForecast[5].DateTime.ToString("h tt", CultureInfo.InvariantCulture),
                Icon6              = GetWeatherIcon(twelveHourForecast[5].WeatherIcon, useFile),
                Temperature6       = Convert.ToInt32(twelveHourForecast[5].Temperature.Value)
            };

            var templateId = SharedResponses.SixHourForecast;
            var card       = new Card(GetDivergedCardName(stepContext.Context, "SixHourForecast"), forecastModel);
            var response   = ResponseManager.GetCardResponse(templateId, card, tokens: null);

            await stepContext.Context.SendActivityAsync(response);

            return(await stepContext.NextAsync());
        }
        /// <summary>
        /// Look up the six hour forecast using Accuweather.
        /// </summary>
        private async Task <DialogTurnResult> GetWeatherResponseAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            var state = await StateAccessor.GetAsync(stepContext.Context, cancellationToken : cancellationToken);

            var service = ServiceManager.InitService(Settings);

            if (!string.IsNullOrEmpty(state.Geography))
            {
                (state.Latitude, state.Longitude) = await service.GetCoordinatesByQueryAsync(state.Geography);
            }

            // The applicable query is specified as a comma separated string composed by latitude followed by longitude.
            // e.g. "47.641268,-122.125679".
            var qureyString = string.Format("{0},{1}", state.Latitude.ToString(), state.Longitude.ToString());

            string location = string.Empty;

            if (!double.IsNaN(state.Latitude) && !double.IsNaN(state.Longitude))
            {
                location = await service.GetLocationByQueryAsync(qureyString);
            }
            else
            {
                throw new Exception("Must have Geography or Latitude & Longitude!");
            }

            var oneDayForecast = await service.GetOneDayForecastAsync(qureyString);

            var twelveHourForecast = await service.GetTwelveHourForecastAsync(qureyString);

            bool useFile = Channel.GetChannelId(stepContext.Context) == Channels.Msteams;

            var forecastModel = new SixHourForecastCard()
            {
                Speak              = oneDayForecast.Forecasts[0].Day.ShortPhrase,
                Location           = location,
                DayIcon            = GetWeatherIcon(oneDayForecast.Forecasts[0].Day.IconCode, useFile),
                Date               = $"{DateTime.Parse(oneDayForecast.Forecasts[0].Date).DayOfWeek} {CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(DateTime.Parse(oneDayForecast.Forecasts[0].Date).Month)} {DateTime.Parse(oneDayForecast.Forecasts[0].Date).Day}",
                MinimumTemperature = Convert.ToInt32(oneDayForecast.Forecasts[0].Temperature.Minimum.Value),
                MaximumTemperature = Convert.ToInt32(oneDayForecast.Forecasts[0].Temperature.Maximum.Value),
                ShortPhrase        = oneDayForecast.Forecasts[0].Day.ShortPhrase,
                WindDescription    = $"Winds {oneDayForecast.Forecasts[0].Day.Wind.Speed.Value} {oneDayForecast.Forecasts[0].Day.Wind.Speed.Unit} {oneDayForecast.Forecasts[0].Day.Wind.Direction.LocalizedDescription}",
                Hour1              = DateTime.Parse(twelveHourForecast.Forecasts[0].Date).ToString("h tt", CultureInfo.InvariantCulture),
                Icon1              = GetWeatherIcon(twelveHourForecast.Forecasts[0].IconCode, useFile),
                Temperature1       = Convert.ToInt32(twelveHourForecast.Forecasts[0].Temperature.Value),
                Hour2              = DateTime.Parse(twelveHourForecast.Forecasts[1].Date).ToString("h tt", CultureInfo.InvariantCulture),
                Icon2              = GetWeatherIcon(twelveHourForecast.Forecasts[1].IconCode, useFile),
                Temperature2       = Convert.ToInt32(twelveHourForecast.Forecasts[1].Temperature.Value),
                Hour3              = DateTime.Parse(twelveHourForecast.Forecasts[2].Date).ToString("h tt", CultureInfo.InvariantCulture),
                Icon3              = GetWeatherIcon(twelveHourForecast.Forecasts[2].IconCode, useFile),
                Temperature3       = Convert.ToInt32(twelveHourForecast.Forecasts[2].Temperature.Value),
                Hour4              = DateTime.Parse(twelveHourForecast.Forecasts[3].Date).ToString("h tt", CultureInfo.InvariantCulture),
                Icon4              = GetWeatherIcon(twelveHourForecast.Forecasts[3].IconCode, useFile),
                Temperature4       = Convert.ToInt32(twelveHourForecast.Forecasts[3].Temperature.Value),
                Hour5              = DateTime.Parse(twelveHourForecast.Forecasts[4].Date).ToString("h tt", CultureInfo.InvariantCulture),
                Icon5              = GetWeatherIcon(twelveHourForecast.Forecasts[4].IconCode, useFile),
                Temperature5       = Convert.ToInt32(twelveHourForecast.Forecasts[4].Temperature.Value),
                Hour6              = DateTime.Parse(twelveHourForecast.Forecasts[5].Date).ToString("h tt", CultureInfo.InvariantCulture),
                Icon6              = GetWeatherIcon(twelveHourForecast.Forecasts[5].IconCode, useFile),
                Temperature6       = Convert.ToInt32(twelveHourForecast.Forecasts[5].Temperature.Value)
            };

            if (state.IsAction)
            {
                var summary      = forecastModel.Speak;
                var actionResult = new ActionResult()
                {
                    Summary       = summary,
                    ActionSuccess = true
                };
                return(await stepContext.EndDialogAsync(actionResult, cancellationToken : cancellationToken));
            }

            var templateId = SharedResponses.SixHourForecast;
            var card       = new Card(GetDivergedCardName(stepContext.Context, "SixHourForecast"), forecastModel);
            var response   = TemplateManager.GenerateActivity(templateId, card, tokens: null);

            await stepContext.Context.SendActivityAsync(response, cancellationToken);

            return(await stepContext.NextAsync(cancellationToken : cancellationToken));
        }