/// <summary>
        /// Exact implementation for searching for PR on given weather/melanoma risk/vitd status.
        /// </summary>
        /// <param name="weatherCondition"></param>
        /// <param name="risk"></param>
        /// <param name="vitD"></param>
        /// <returns></returns>
        private List<ForecastResponse> GetRecommendationImpl(ForecastRequest [] request, string risk, bool vitD, string userName, int appId)
        {
            List<ForecastResponse> list = new List<ForecastResponse>();

            using (WeatherAppDbEntities db = new WeatherAppDbEntities())
            {
                var vitDId = db.VitaminDs.Where(con => con.Type == vitD).Select(info => info.Id).FirstOrDefault();
                var melanomaRiskId = db.MelanomaRisks.Where(con => con.Type == risk).Select(info => info.Id).FirstOrDefault();
                var userId = db.SendInfo.Where(con => con.UserName == userName).Select(info => info.Id).FirstOrDefault();

                var appTypeId =
                    db.ApplicationNames.Where(app => app.Id == appId).Select(app => app.Id).FirstOrDefault();
                if (appId == 0 || appTypeId == 0)
                   appId = Options.ApplicationName;

                foreach (ForecastRequest req in request)
                {
                    var condId = db.Conditions.Where(con => con.WeatherCond == req.weather).Select(info => info.Id).FirstOrDefault();
                    if (condId == 0)
                        return null;
                    list.Add(new ForecastResponse { gtForecast = factory.GetSendForecastDao().StorageProcetureCalling(req.date, condId, vitDId, melanomaRiskId, userId, appId), date = req.date.ToString() } );
                }

                var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
                logger.Info(string.Format("Inputs: [ForecastRequest = {0}, Risk = {1}, vitaminD = {2} ] for user {3}", serializer.Serialize(request), risk , vitD, userName));

                logger.Info(string.Format("Outputs: GT forecast [{0}]", string.Join(",", serializer.Serialize(list) )));

                return list;
            }
        }
 /// <summary>
 /// Returns PR for given weather/alert/app-chains. First scans for alerts, then for regular weather conditions.
 /// </summary>
 /// <param name="weatherCondition"></param>
 /// <param name="alert"></param>
 /// <param name="acr"></param>
 /// <returns></returns>
 public List<ForecastResponse> GetRecommendation(ForecastRequest [] request, AppChainResults acr, string userName, int appId)
 {
     var _melanomaRisk = acr.MelanomaAppChainResult.ToString();
     var _vitDRisk = acr.VitDAppChainResult;
     var _rec = GetRecommendationImpl(request, _melanomaRisk, _vitDRisk, userName, appId);
     if (_rec != null)
         return _rec;
     return GetRecommendationImpl(request, _melanomaRisk, _vitDRisk, userName, appId);
 }
        /// <summary>
        /// Returns personalized recommendation for given weather/alert/appChain results
        /// </summary>
        /// <param name="weatherCondition"></param>
        /// <param name="weatherAlertCode"></param>
        /// <param name="acr"></param>
        /// <returns></returns>
        public string GetPersonalizedRiskDescription(string weatherCondition, string weatherAlertCode, AppChainResults acr, string userName, int appId)
        {
            var currentDate =  DateTime.Now.Date ;

            ForecastRequest[] request = new ForecastRequest[] { new ForecastRequest { date = currentDate, alertCode = weatherAlertCode, weather = weatherCondition } };

            var _s = new PersonalizedRecommendationsWorker().GetRecommendation(request, acr, userName, appId);
            if (_s != null)
                return _s[0].gtForecast;
            return
                "Personalization is not possible due to insufficient genetic data in the selected file. Choose a different genetic data file.";
        }