/// <summary>
        /// Validates the temporarily generated token.
        /// User must be logged In to validate this token.
        /// </summary>
        /// <param name="userName">logged in userName</param>
        /// <param name="Token">temporarily generated token</param>
        /// <returns></returns>
        public bool ValidateTemporarilyValidGeneratedToken(string userName, string Token, EmailFunctionType type)
        {
            var decryptedToken = Token.Decrypt();
            DateTime dycriptedDate;
            if (decryptedToken.Split(';')[2].Equals(type.ToString()))
            {
                if (DateTime.TryParse(decryptedToken.Split(';')[1], out dycriptedDate))
                {
                    if (dycriptedDate > DateTime.Now)
                    {
                        using (var userContext = new UsersContext())
                        {
                            var userProfile = userContext.UserProfiles.Where(u => u.Email.Equals(userName)).FirstOrDefault();
                            var tokens = userProfile.TemporarilyValidGeneratedToken.Split(';');
                            foreach (var newToken in tokens)
                            {

                                if (newToken.Replace("Validated", "").Equals(Token))
                                {
                                    var dycripteduserName = decryptedToken.Split(';')[0];
                                    if (dycripteduserName == userName)
                                    {
                                        return true;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return false;
        }
        public bool CheckUserForValidatedTokenOrValidateToken(string email, string token, EmailFunctionType type)
        {
            using (var userContext = new UsersContext())
            {
                var userProfile = userContext.UserProfiles.Where(u => u.Email.Equals(email)).FirstOrDefault();
                var tokens = userProfile.TemporarilyValidGeneratedToken.Split(';');

                //We must make sure we can only have 1 validated token here
                var validToken = tokens.Where(t => t.EndsWith("Validated")).FirstOrDefault();
                var dycriptedvalidToken = string.IsNullOrEmpty(validToken) ? "" : validToken.Replace("Validated", "").Decrypt();
                if (string.IsNullOrEmpty(validToken))
                {
                    userProfile.TemporarilyValidGeneratedToken = userProfile.TemporarilyValidGeneratedToken.Replace(token, token + "Validated");
                    userContext.SaveChanges();
                    return false;
                }
                else
                {
                    if (dycriptedvalidToken.Split(';')[2].Equals(type.ToString()))
                    {
                        return false;
                    }
                    else
                    {
                        //Remove the tokens and return true
                        //if we want to use these tokens for more then just email change we must only remove the 2 email change tokens.
                        userProfile.TemporarilyValidGeneratedToken = "";
                        userContext.SaveChanges();
                        return true;
                    }
                }
            }
        }
        /// <summary>
        /// Generates a temporaryValid token using a username and datetime from now.
        /// this token can be used as a variable in urls to identify valid users.
        /// Make sure to Remove the token after it has been used or when they are no longer valid
        /// </summary>
        /// <param name="userName">username</param>
        /// <param name="tokenExperationInMinutesFromNow">The ammount of minutes the token should be valid</param>
        /// <returns></returns>
        private string GenerateTemporaryValidToken(string userName, int tokenExperationInMinutesFromNow, EmailFunctionType type)
        {
            var token = string.Format("{0};{1};{2}", userName, DateTime.Now.AddMinutes(tokenExperationInMinutesFromNow), type.ToString()).Encrypt();
            using (var userContext = new UsersContext())
            {
                var userProfile = userContext.UserProfiles.Where(u => u.Email.Equals(userName)).FirstOrDefault();
                //If the token conaints a splitter it already has a set token, so just remove them and set it again
                if (!string.IsNullOrEmpty(userProfile.TemporarilyValidGeneratedToken))
                {
                    if (userProfile.TemporarilyValidGeneratedToken.Contains(';'))
                    {
                        userProfile.TemporarilyValidGeneratedToken = "";
                        userProfile.TemporarilyValidGeneratedToken = token;
                    }
                    else
                    {
                        userProfile.TemporarilyValidGeneratedToken += ";" + token;
                    }
                }
                else
                {
                    userProfile.TemporarilyValidGeneratedToken = token;
                }
                userContext.SaveChanges();
            }

            return token;
        }