The purpose of this class is supply methods for creating medals and getting how much points to next medal
        public void CheckIfFullfiledRequirementTest_ShouldCheckListWhichAlredyContainThisMedalAndReturnEmptyMedalList()
        {
            //Arrange
            SpontaneousUserModel userModelWithMedal = new SpontaneousUserModel()
            {
                UserMedalsList = new List<UserMedal>()
            };
            userModelWithMedal.UserMedalsList.Add(new WelcomeUserMedal());
            UserActivity userActivity = new PageViewActivity("TestPage");

            //Act
            MedalRequirementsChecker medalChecker = new MedalRequirementsChecker();
            List<UserMedal> userModelWithMedalResult = medalChecker.ObtainMedalBecauseOfActivity(userModelWithMedal, userActivity);

            //Assert
            Assert.AreEqual(userModelWithMedalResult.Count, 0);
        }
        public void CheckIfFullfiledRequirementTest_ShouldCheckListWithoutThisMedalAndRequirementForThisMedalNotAchieved_MustReturnNotEmptyMedalList()
        {
            //Arrange
            SpontaneousUserModel userModelWithOutMedal = new SpontaneousUserModel()
            {
                UserActivityList = new List<UserActivity>(),
                UserMedalsList = new List<UserMedal>()
            };
            //Requirement = 3
            for (int i = 0; i < 2; i++)
            {
                userModelWithOutMedal.UserActivityList.Add(new PageViewActivity("TestPage"));
            }
            UserActivity userActivity = new PageViewActivity("TestPage");

            //Act
            MedalRequirementsChecker medalChecker = new MedalRequirementsChecker();
            List<UserMedal> userModelWithMedalResult = medalChecker.ObtainMedalBecauseOfActivity(userModelWithOutMedal, userActivity);

            //Assert
            Assert.AreEqual(userModelWithMedalResult.Count, 0);
        }
        public void CheckIfFullfiledRequirementTest_ShouldCheckListWithOtherMedalAndReturnNotEmptyMedalList()
        {
            //Arrange
            SpontaneousUserModel userModelWithOtherMedal = new SpontaneousUserModel()
            {
                UserActivityList = new List<UserActivity>(),
                UserMedalsList = new List<UserMedal>()
            };
            for (int i = 0; i < 3; i++)
            {
                userModelWithOtherMedal.UserActivityList.Add(new PageViewActivity("TestPage"));
            }
            userModelWithOtherMedal.UserMedalsList.Add(new AddRestaurantMedal());
            UserActivity userActivity = new PageViewActivity("TestPage");

            //Act
            MedalRequirementsChecker medalChecker = new MedalRequirementsChecker();
            List<UserMedal> userModelWithOtherMedalResult = medalChecker.ObtainMedalBecauseOfActivity(userModelWithOtherMedal, userActivity);

            //Assert
            Assert.AreNotEqual(userModelWithOtherMedalResult.Count, 0);
        }
        internal void SaveUserActivity(UserActivity userActivity)
        {
            var userProfile = GetUserProfile();
            var userData = userProfile.GetUserData();
            string userActivityType = userActivity.GetType().Name;

            if (userActivity == null)
            {
                log.WarnFormat("[SaveUserActivity] User={0} tried to save user activity, but received NULL parameter.", userProfile.UserName);
                return;
            };

            if (userData.UserActivityList == null)
            {
                userData.UserActivityList = new List<UserActivity>();
            }

            userActivity.Date = DateTime.UtcNow;
            userData.TotalPoints += userActivity.Points;

            userData.UserActivityList.Add(userActivity);

            //Check if reached Medal
            MedalRequirementsChecker medalChecker = new MedalRequirementsChecker();
            List<UserMedal> medalList = medalChecker.ObtainMedalBecauseOfActivity(userData, userActivity);
            if(medalList.Count > 0)
            {
                if (userData.UserMedalsList == null) userData.UserMedalsList = new List<UserMedal>();
                foreach (var medal in medalList)
                {
                    userData.UserMedalsList.Add(medal);
                }

                userData.MedalNotificationFlag = true;
            }

            userProfile.SetUserData(userData);
            userProfile.Save();
            log.InfoFormat("[SaveUserActivity] user={0}, userActivity={1}.", userProfile.UserName, userActivity.ToString());
        }