public async Task <IEnumerable <DailyWeatherBE> > GetWeatherForecasts(WeatherParamsData paramsData)
        {
            var requestModel = Mapper.Map <DarkSkyRequestModel>(paramsData);

            var response = await _client.GetDarkSkyWeatherResponseAsync(requestModel);

            return(!response.HasError ? Mapper.Map <List <DailyWeatherBE> >(response.Response) : new List <DailyWeatherBE>());
        }
        private static object DarkSkyUnitsTypeConverter(WeatherParamsData value)
        {
            switch (value.UnitsType)
            {
            case UnitsType.Metric:
                return("si");

            default:
                return("us");
            }
        }
        private static object OpenWeatherMapUnitsTypeConverter(WeatherParamsData value)
        {
            switch (value.UnitsType)
            {
            case UnitsType.Metric:
                return("metric");

            default:
                return("imperial");
            }
        }
        private static object DarkSkyLangTypeConverter(WeatherParamsData value)
        {
            switch (value.LangType)
            {
            case LangType.Russian:
                return("ru");

            case LangType.Ukrainian:
                return("uk");

            default:
                return("en");
            }
        }
        public async Task <IEnumerable <DailyWeatherForecastDTO> > GetAverageWeatherForecastForPeriodByAllProviders(WeatherParamsData data)
        {
            var sources = new List <IEnumerable <DailyWeatherForecastDTO> >();

            foreach (WeatherProviderType type in Enum.GetValues(typeof(WeatherProviderType)))
            {
                var dailyWeather = await GetWeatherForecastsForPeriod(data, type);

                if (dailyWeather.Any())
                {
                    sources.Add(dailyWeather);
                }
            }

            return(!sources.Any() ? new List <DailyWeatherForecastDTO>() : AverageForecast.GetAverageForecast(sources.ToArray()));
        }
        public async Task <IEnumerable <DailyWeatherForecastDTO> > GetWeatherForecastsForPeriod(WeatherParamsData data, WeatherProviderType providerType)
        {
            var dailyWeather = await _weatherProvider.GetWeatherForecasts(providerType, data);

            var result = Mapper.Map <IEnumerable <DailyWeatherForecastDTO> >(dailyWeather);

            //optional save to db
            //_db.WeatherForecastRepository.AddRange(result);
            //await _db.SaveChangesAsync();

            return(result);
        }
        public async Task <IEnumerable <DailyWeatherBE> > GetWeatherForecasts(WeatherProviderType providerType, WeatherParamsData model)
        {
            IWeatherProvider provider = _providers.FirstOrDefault(x => x.ProviderType == providerType);

            if (provider == null)
            {
                throw new NotSupportedException(nameof(providerType));
            }

            return(await provider.GetWeatherForecasts(model));
        }
        public async Task <Dictionary <WeatherProviderType, IEnumerable <DailyWeatherBE> > > GetWeatherForecastsByAllProviders(WeatherParamsData model)
        {
            var result = new Dictionary <WeatherProviderType, IEnumerable <DailyWeatherBE> >();

            foreach (var provider in _providers)
            {
                var forecasts = await provider.GetWeatherForecasts(model);

                if (forecasts.Any())
                {
                    result.Add(provider.ProviderType, forecasts);
                }
            }

            return(result);
        }