/// <summary>
 /// Updates the activity's last added date in the Session
 /// </summary>
 protected void UpdateActivityLastAdded(OkbConstants.ActivityCategories category)
 {
     if (category == OkbConstants.ActivityCategories.Joined) return; //no need to store join activity
     Session["Activity:" + category.ToString()] = DateTime.Now;
 }
        public void EditDetails(ProfileDetail details, OkbConstants.ProfileDetailSections section, int profileId)
        {
            var db = new OkbDbContext();

            //check if we're updating or adding
            var currDetails = db.ProfileDetails.Find(profileId);
            if (currDetails==null)
            {
                //adding new Profile Detail row
                details.ProfileId = profileId;
                db.ProfileDetails.Add(details);
                db.SaveChanges();
                return;
            }

            //otherwise we're updating
            //db.ProfileDetails.Attach(details);
            //db.Entry(details).State = System.Data.Entity.EntityState.Modified;

            switch (section)
            {
                case OkbConstants.ProfileDetailSections.Basic:
                    currDetails.LookingFor = details.LookingFor;
                    currDetails.Height = details.Height;
                    currDetails.Education = details.Education;
                    currDetails.RelationshipStatus = details.RelationshipStatus;
                    currDetails.HaveChildren = details.HaveChildren;
                    currDetails.WantChildren = details.WantChildren;
                    currDetails.Nationality = details.Nationality;
                    currDetails.MonthlyIncome = details.MonthlyIncome;
                    currDetails.LivingSituation = details.LivingSituation;
                    currDetails.CarSituation = details.CarSituation;
                    currDetails.EconomicConcept = details.EconomicConcept;
                    //db.Entry(details).Property(col => col.LookingFor).IsModified = true;
                    //db.Entry(details).Property(col => col.Height).IsModified = true;
                    //db.Entry(details).Property(col => col.Education).IsModified = true;
                    //db.Entry(details).Property(col => col.RelationshipStatus).IsModified = true;
                    //db.Entry(details).Property(col => col.HaveChildren).IsModified = true;
                    //db.Entry(details).Property(col => col.WantChildren).IsModified = true;
                    //db.Entry(details).Property(col => col.Nationality).IsModified = true;
                    //db.Entry(details).Property(col => col.MonthlyIncome).IsModified = true;
                    //db.Entry(details).Property(col => col.LivingSituation).IsModified = true;
                    //db.Entry(details).Property(col => col.CarSituation).IsModified = true;
                    //db.Entry(details).Property(col => col.EconomicConcept).IsModified = true;
                    break;

                case OkbConstants.ProfileDetailSections.Lifestyle:
                    currDetails.Smoke = details.Smoke;
                    currDetails.Drink = details.Drink;
                    currDetails.Exercise = details.Exercise;
                    currDetails.Eating = details.Eating;
                    currDetails.Shopping = details.Shopping;
                    currDetails.Religion = details.Religion;
                    currDetails.SleepSchedule = details.SleepSchedule;
                    currDetails.SocialCircle = details.SocialCircle;
                    currDetails.MostMoney = details.MostMoney;
                    currDetails.Housework = details.Housework;
                    currDetails.LovePets = details.LovePets;
                    currDetails.HavePets = details.HavePets;
                    break;

                case OkbConstants.ProfileDetailSections.Job:
                    currDetails.Job = details.Job;
                    currDetails.Industry = details.Industry;
                    currDetails.WorkHours = details.WorkHours;
                    currDetails.CareerAndFamily = details.CareerAndFamily;
                    break;

                case OkbConstants.ProfileDetailSections.Appearance:
                    currDetails.BodyType = details.BodyType;
                    currDetails.FaceType = details.FaceType;
                    currDetails.EyeColor = details.EyeColor;
                    currDetails.EyeShape = details.EyeShape;
                    currDetails.HairColor = details.HairColor;
                    currDetails.HairLength = details.HairLength;
                    currDetails.HairType = details.HairType;
                    currDetails.SkinType = details.SkinType;
                    currDetails.Muscle = details.Muscle;
                    currDetails.HealthCondition = details.HealthCondition;
                    currDetails.DressStyle = details.DressStyle;
                    break;

                case OkbConstants.ProfileDetailSections.Personality:
                    currDetails.Sociability = details.Sociability;
                    currDetails.Humour = details.Humour;
                    currDetails.Temper = details.Temper;
                    currDetails.Feelings = details.Feelings;
                    break;

                default:
                    //invalid section. fail silently?
                    break;
            }

            db.SaveChanges();
        }
        /// <summary>
        /// Returns true if it is ok to add the activity to the feed. It is OK if the time
        /// elapsed is less than the pre-defined interval since the last time the activity was added.
        /// We use Session to store the last added activity time. Prevents the activity feed from
        /// being overloaded with a user's activities.
        /// </summary>
        protected bool IsOkToAddActivity(OkbConstants.ActivityCategories category)
        {
            DateTime threshold;

            switch (category)
            {
                case OkbConstants.ActivityCategories.Joined:
                    return true;
                case OkbConstants.ActivityCategories.UploadedPhoto:
                    threshold = DateTime.Now.AddMinutes(-OkbConstants.ACTIVITY_UPLOADEDPHOTO_INTERVAL);
                    break;
                case OkbConstants.ActivityCategories.EditedProfileText:
                    threshold = DateTime.Now.AddMinutes(-OkbConstants.ACTIVITY_EDITEDPROFILE_INTERVAL);
                    break;
                case OkbConstants.ActivityCategories.AnsweredQuestion:
                    threshold = DateTime.Now.AddMinutes(-OkbConstants.ACTIVITY_ANSWEREDQUESTION_INTERVAL);
                    break;
                default:
                    //throw exception?
                    return true;
            }

            var lastAdded = Session["Activity:" + category.ToString()];

            if (lastAdded == null || (DateTime)lastAdded < threshold)
            {
                return true;
            }

            return false;
        }