/// <summary>
        /// Imports the achievements from V2
        /// </summary>
        /// <param name="achieveTemplateTable">File w/ achievement template data</param>
        /// <param name="achievePointTemplateTable">Achievement point template data (to be rolled into achievement)</param>
        /// <param name="achieveRequirementsTable">Achievement requirement data</param>
        /// <param name="achieveCaretakerTable">Achievement caretaker data</param>
        /// <param name="delimiter">Delimiter between data</param>
        /// <param name="work">The DB access</param>
        private void ImportAchievements(
			HttpPostedFileBase achieveTemplateTable,
			HttpPostedFileBase achievePointTemplateTable,
			HttpPostedFileBase achieveRequirementsTable,
			String delimiter,
			UnitOfWork work)
        {
            // Grab the data
            List<Dictionary<String, String>> achieveData = GetDataFromFile(achieveTemplateTable, delimiter);
            if (achieveData == null)
            {
                ModelState.AddModelError("", "Error with Achievement Template table.  Check Debug Output");
                return;
            }

            List<Dictionary<String, String>> pointData = GetDataFromFile(achievePointTemplateTable, delimiter);
            if (pointData == null)
            {
                ModelState.AddModelError("", "Error with Achievement Point Template table.  Check Debug Output");
                return;
            }

            List<Dictionary<String, String>> reqData = GetDataFromFile(achieveRequirementsTable, delimiter);
            if (reqData == null)
            {
                ModelState.AddModelError("", "Error with Achievement Requirements table.  Check Debug Output");
                return;
            }

            //List<Dictionary<String, String>> caretakerData = GetDataFromFile(achieveCaretakerTable, delimiter);
            //if (caretakerData == null)
            //{
            //	ModelState.AddModelError("", "Error with Achievement Caretaker table.  Check Debug Output");
            //	return;
            //}

            // The templates that need to be added
            List<achievement_template> templatesToAdd = new List<achievement_template>();

            // Go through each data row
            foreach (Dictionary<String, String> row in achieveData)
            {
                // Get related users
                ImportedUser editedBy = _userMap[int.Parse(row["last_modified_by"])];
                ImportedUser creator = _userMap[int.Parse(row["creatorID"])];
                if (creator == null)
                    continue; // Must have a creator

                // Grab other info
                int oldID = int.Parse(row["achievementID"]);

                int state = (int)JPPConstants.AchievementQuestStates.Active;
                bool isRetired = Boolean.Parse(row["is_retired"]);
                if (isRetired)
                    state = (int)JPPConstants.AchievementQuestStates.Retired;

                int type = (int)JPPConstants.AchievementTypes.Scan;
                switch (int.Parse(row["type"]))
                {
                    // 1 - usersubmission
                    case 1: type = (int)JPPConstants.AchievementTypes.UserSubmission; break;

                    // 2 - scan
                    case 2: type = (int)JPPConstants.AchievementTypes.Scan; break;

                    // 3 - system
                    case 3: type = (int)JPPConstants.AchievementTypes.System; break;

                    // 4 - adminassigned
                    case 4: type = (int)JPPConstants.AchievementTypes.AdminAssigned; break;

                    // 5 - threshold
                    case 5: type = (int)JPPConstants.AchievementTypes.Threshold; break;
                }

                int? triggerType = null;
                if (!String.IsNullOrWhiteSpace(row["system_trigger_type"]))
                {
                    switch (int.Parse(row["system_trigger_type"]))
                    {
                        // TODO: Finalize this
                        default: break;
                    }
                }

                // Set up the template
                achievement_template template = new achievement_template()
                {
                    id = oldID, // This will get overridden, but necessary for a look-up later
                    content_type = String.IsNullOrWhiteSpace(row["content_type"]) ? (int?)null : int.Parse(row["content_type"]),
                    created_date = DateTime.Parse(row["date_created"]),
                    creator_id = creator.NewID,
                    description = row["description"],
                    featured = Boolean.Parse(row["is_featured"]),
                    hidden = Boolean.Parse(row["is_hidden"]),
                    icon = row["icon"],
                    icon_file_name = "",
                    is_repeatable = Boolean.Parse(row["is_repeatable"]),
                    last_modified_by_id = editedBy == null ? (int?)null : editedBy.NewID,
                    modified_date = DateTime.Parse(row["date_modified"]),
                    parent_id = String.IsNullOrWhiteSpace(row["parentID"]) ? (int?)null : int.Parse(row["parentID"]),
                    posted_date = DateTime.Now,
                    repeat_delay_days = String.IsNullOrWhiteSpace(row["repeat_delay"]) ? (int?)null : int.Parse(row["repeat_delay"]),
                    retire_date = isRetired ? DateTime.Parse(row["date_retired"]) : (DateTime?)null,
                    state = state,
                    system_trigger_type = triggerType,
                    threshold = String.IsNullOrWhiteSpace(row["threshhold"]) ? (int?)null : int.Parse(row["threshhold"]),
                    title = row["title"],
                    type = type,
                    keywords = ""
                };

                // Create imported achievement
                ImportedEarnable impAchieve = new ImportedEarnable()
                {
                    UniqueData = template.title,
                    OldID = oldID
                };

                // Add to temporary list
                templatesToAdd.Add(template);
                _achievementMap.Add(impAchieve.OldID, impAchieve);
            }

            // Loop through points and put in correct achievements
            foreach (Dictionary<String, String> row in pointData)
            {
                int achievementID = int.Parse(row["achievementID"]);
                int categoryID = int.Parse(row["categoryID"]);
                int points = int.Parse(row["points"]);
                achievement_template template = templatesToAdd.Where(t => t.id == achievementID).FirstOrDefault();
                if (template == null)
                    continue;

                // Switch on old category id
                switch (categoryID)
                {
                    case 1: template.points_create = points; break;		// Create
                    case 2: template.points_learn = points; break;		// Learn
                    case 3: template.points_socialize = points; break;	// Socialize
                    case 4: template.points_explore = points; break;	// Explore
                }
            }

            // Add templates to database
            try
            {
                work.EntityContext.Configuration.AutoDetectChangesEnabled = false;
                foreach (achievement_template template in templatesToAdd)
                    work.EntityContext.achievement_template.Add(template);
            }
            finally { work.EntityContext.Configuration.AutoDetectChangesEnabled = true; }
            work.SaveChanges();

            // Update the map with new ids
            foreach (ImportedEarnable e in _achievementMap.Values)
            {
                e.NewID = (from a in work.EntityContext.achievement_template where a.title == e.UniqueData select a.id).FirstOrDefault();
            }

            // Put in requirements
            try
            {
                // Speed up
                work.EntityContext.Configuration.AutoDetectChangesEnabled = false;

                foreach (Dictionary<String, String> row in reqData)
                {
                    // Get this achievement
                    ImportedEarnable achieve = GetImportedEarnableByOldID(_achievementMap, row["achievementID"]);
                    if (achieve == null || achieve.NewID == 0)
                        continue;

                    work.EntityContext.achievement_requirement.Add(new achievement_requirement()
                    {
                        achievement_id = achieve.NewID,
                        description = row["description"]
                    });
                }
            }
            finally { work.EntityContext.Configuration.AutoDetectChangesEnabled = true; }
            work.SaveChanges();

            //// Put in caretakers
            //try
            //{
            //	// Speed up
            //	work.EntityContext.Configuration.AutoDetectChangesEnabled = false;

            //	foreach (Dictionary<String, String> row in caretakerData)
            //	{
            //		// Get this achievement and user
            //		ImportedEarnable achieve = GetImportedEarnableByOldID(_achievementMap, row["achievementID"]);
            //		if (achieve == null || achieve.NewID == 0)
            //			continue;
            //		ImportedUser user = GetImportedUserByOldID(row["caretakerID"]);
            //		if (user == null || user.NewID == 0)
            //			continue;

            //		work.EntityContext.achievement_caretaker.Add(new achievement_caretaker()
            //		{
            //			achievement_id = achieve.NewID,
            //			caretaker_id = user.NewID
            //		});
            //	}
            //}
            //finally { work.EntityContext.Configuration.AutoDetectChangesEnabled = true; }
            //work.SaveChanges();
        }
        private AchievementInstanceResult CanAwardRepeatableAchievement(achievement_template template, int userID)
        {
            achievement_instance lastInstance = _dbContext.achievement_instance.Where(ai => ai.achievement_id == template.id && ai.user_id == userID).ToList().LastOrDefault();

            //If lastInstance is null, the user has never gotten this achievement before, so it can be awarded
            if (lastInstance == null)
                return AchievementInstanceResult.First;

            var dateToday = DateTime.Now.Date;
            var datelastAchievedPlusDelay = lastInstance.achieved_date.Date.AddDays((double)template.repeat_delay_days);
            //Check if enough days have passed since the last instance was achieved
            if (dateToday.CompareTo(datelastAchievedPlusDelay) < 0)
                return AchievementInstanceResult.TooSoon;

            //Enough time has passed, the achievement can be awarded again.
            return AchievementInstanceResult.Repeat;
        }
        public void AdminAddAchievement(AddAchievementViewModel model)
        {
            //Create the new achievement template from the model
            achievement_template newAchievement = new achievement_template()
            {
                title = model.Title,
                description = model.Description,
                icon = model.IconFilePath,
                icon_file_name = model.Icon,
                type = model.Type,
                featured = false,
                hidden = model.Hidden,
                is_repeatable = model.IsRepeatable,
                state = (int)JPPConstants.AchievementQuestStates.Draft,
                parent_id = model.ParentID,
                threshold = model.Threshold,
                creator_id = model.CreatorID,
                created_date = DateTime.Now,
                posted_date = null,
                retire_date = null,
                modified_date = null,
                last_modified_by_id = null,
                content_type = model.ContentType,
                system_trigger_type = model.SystemTriggerType,
                repeat_delay_days = model.RepeatDelayDays,
                points_create = model.PointsCreate,
                points_explore = model.PointsExplore,
                points_learn = model.PointsLearn,
                points_socialize = model.PointsSocialize,
                keywords = ""

            };

            //Create all the requirements for the achievement to be added to the database
            List<achievement_requirement> requirementsList = new List<achievement_requirement>();
            if (!String.IsNullOrWhiteSpace(model.Requirement1))
                requirementsList.Add(new achievement_requirement { achievement_id = newAchievement.id, description = model.Requirement1 });
            if (!String.IsNullOrWhiteSpace(model.Requirement2))
                requirementsList.Add(new achievement_requirement { achievement_id = newAchievement.id, description = model.Requirement2 });
            if (!String.IsNullOrWhiteSpace(model.Requirement3))
                requirementsList.Add(new achievement_requirement { achievement_id = newAchievement.id, description = model.Requirement3 });
            if (!String.IsNullOrWhiteSpace(model.Requirement4))
                requirementsList.Add(new achievement_requirement { achievement_id = newAchievement.id, description = model.Requirement4 });
            if (!String.IsNullOrWhiteSpace(model.Requirement5))
                requirementsList.Add(new achievement_requirement { achievement_id = newAchievement.id, description = model.Requirement5 });
            if (!String.IsNullOrWhiteSpace(model.Requirement6))
                requirementsList.Add(new achievement_requirement { achievement_id = newAchievement.id, description = model.Requirement6 });

            //Create all the caretakers for the achievement to be added to the database
            List<achievement_caretaker> caretakersList = new List<achievement_caretaker>();
            if (model.SelectedCaretakersList != null)
            {
                for (int j = 0; j < model.SelectedCaretakersList.Count; j++)
                {
                    caretakersList.Add(new achievement_caretaker() { achievement_id = newAchievement.id, caretaker_id = model.SelectedCaretakersList[j] });
                }
            }

            AddAchievementToDatabase(newAchievement);
            AddRequirementsToDatabase(requirementsList);
            AddCaretakersToDatabase(caretakersList);

            Save();
        }
 private void AddAchievementToDatabase(achievement_template achievementTemplate)
 {
     //add the achievement
     if (achievementTemplate != null)
         _dbContext.achievement_template.Add(achievementTemplate);
 }