//
        // GET: /
        public ViewResult Index()
        {
            HTMLSanitizer hs = new HTMLSanitizer();

            var QuestionList = from questions in db.Questions
                               orderby questions.Created_At descending
                               select questions;
            List<User> usersList = new List<User>();
            List<TagsIDs> tagList = new List<TagsIDs>();
            foreach (Question vraag in QuestionList)
            {
                // Strip all HTML tags from the question content
                vraag.Content = hs.Sanitize(vraag.Content, HTMLSanitizerOption.StripTags);

                // Limit the content of a question on the front page to max 500 chars.
                if (vraag.Content.Length > 500)
                    vraag.Content = vraag.Content.Substring(0, 500) + " ...";

                // Build a list of tags that this question is tagged with.
                var TagList = from tagsQuestion in db.Tags
                              join c in db.QuestionTags on tagsQuestion.TagID equals c.TagId
                              where c.QuestionId == vraag.QuestionID
                              select tagsQuestion;
                // create a list of all the tags linked to the question which has this tag
                foreach (Tag i in TagList)
                    tagList.Add(new TagsIDs(i, vraag.QuestionID));
                // get the user stuff (for displaying the username)
                var UserList = from users in db.Users
                               where users.UserID == vraag.UserId
                               select users;
                // check ifthe list already has this user if not add it
                if(!usersList.Contains(UserList.First()))
                    usersList.Add(UserList.First());
            }

            // give it all back to the viewbag
            ViewBag.Helper = tagList;
            ViewBag.UsersList = usersList;
            ViewBag.QuestionList = QuestionList;

            return View();
        }
        //
        // GET: Vraag/View/detailNum
        public ActionResult View(int id)
        {
            HTMLSanitizer hs = new HTMLSanitizer();
            Markdown md = new Markdown();

            //questiondetails
            var questionDetails = from questionDetail in db.Questions
                                  where questionDetail.QuestionID == id
                                  select questionDetail;
            questionDetails.First().Views += 1;
            db.SaveChanges();
            // check if logged in
            if (User.Identity.IsAuthenticated)
            {
                // give back the rank of this user
                ViewBag.UserRank = (from user in db.Users
                                    where user.UserName == User.Identity.Name
                                    select user.Rank).Single();
            }
            Question questionDetailView = questionDetails.First();

            // Sanitize the post content and title
            // Then process the content with Markdown
            questionDetailView.Title = hs.EscapeHTMLentities(questionDetailView.Title);
            questionDetailView.Content = hs.Sanitize(questionDetailView.Content, HTMLSanitizerOption.UnescapeMarkDown);
            questionDetailView.Content = md.Transform(questionDetailView.Content);

            ViewBag.QuestionDetail = questionDetailView;

            List<TagsIDs> abc = new List<TagsIDs>();

            // get all the tags on this question
            var TagList = from tagsQuestion in db.Tags
                          join c in db.QuestionTags on tagsQuestion.TagID equals c.TagId
                          where c.QuestionId == id
                          select tagsQuestion;
            // add each to the list
            foreach (Tag i in TagList)
            {
                abc.Add(new TagsIDs(i, id));

                // Sanitize each tag its name
                i.Name = hs.Sanitize(i.Name, HTMLSanitizerOption.StripTags);
            }

            ViewBag.Helper = abc;

            // get the user of this question (for the username and link)
            var useringlist = from users in db.Users
                              where users.UserID == questionDetailView.UserId
                              select users;

            ViewBag.QuestionUser = useringlist.First();

            // get the comments on this question
            var commentList = from comments in db.Comments
                              orderby comments.Created_At descending
                              where comments.QuestionId == id
                              select comments;
            // add each to the list
            List<Comment> commentUserView = new List<Comment>(commentList);
            ViewBag.CommentsList = commentList;

            // get a list of all the users that made the comment
            List<User> CommentingUsers = new List<User>();
            foreach (Comment commentje in commentUserView)
            {
                var userComment = from commentse in db.Users
                                  where commentse.UserID == commentje.UserId
                                  select commentse;
                CommentingUsers.Add(userComment.First());
            }

            ViewBag.UserCommentList = CommentingUsers;

            // get the answers
            var answerQuestion = from answers in db.Answers
                                 orderby answers.Created_At descending
                                 where answers.QuestionId == id
                                 select answers;
            List<Answer> answerQuestionView = new List<Answer>(answerQuestion);
            ViewBag.AnswerQuestionList = answerQuestion;

            // Set the count to 'n' or 'geen' if there are no answers yet
            ViewBag.AnswerCount = answerQuestion.Count();
            ViewBag.AnswerQuestionCount = answerQuestion.Count() > 0 ? answerQuestion.Count().ToString() : "geen" ;

            List<User> AnsweringUsers = new List<User>();
            List<Comment> AnswerComments = new List<Comment>();
            List<User> qCommentUsers = new List<User>();
            // for each answer
            foreach (Answer answertje in answerQuestionView)
            {
                // get the userID (for the username)
                var userAnswer = from answerse in db.Users
                                 where answerse.UserID == answertje.UserId
                                 select answerse;

                AnsweringUsers.Add(userAnswer.First());

                // get al the comments
                var answerCommentList = from qcomments in db.Comments
                                        orderby qcomments.Created_At descending
                                        where qcomments.AnswerId == answertje.AnswerID
                                        select qcomments;

                if (answerCommentList.Count() > 0)
                {
                    // if there are some comments add them
                    foreach (Comment cba in answerCommentList)
                        AnswerComments.Add(cba);
                }
                // foreach comment get the user (for the username again)
                foreach (Comment qCommentje in answerCommentList)
                {
                    var userQComment = from qcommentse in db.Users
                                       where qcommentse.UserID == qCommentje.UserId
                                       select qcommentse;

                    qCommentUsers.Add(userQComment.First());
                }

                // Sanitize the content of the answer and process it with Markdown
                answertje.Content = hs.Sanitize(answertje.Content, HTMLSanitizerOption.UnescapeMarkDown);
                answertje.Content = md.Transform(answertje.Content);
            }
            ViewBag.UserAnswerList = AnsweringUsers;
            ViewBag.AnswerComments = AnswerComments;
            ViewBag.qCommentList = qCommentUsers;

            return View();
        }
        public ActionResult Nieuw(Vraag info)
        {
            HTMLSanitizer hs = new HTMLSanitizer();
            Markdown md = new Markdown();
            // to mark the first time (meaning don't check the tags if there are some new ones)
            bool firstTime = false;
            // check where we came from
            if (Request.UrlReferrer.LocalPath == "/vraag/check")
                firstTime = true; // set the first time if we came from there
            if (info.vraag == null) // check if the question isn't empty
                ModelState.AddModelError("", "Ga terug en voer een titel voor je vraag in.");
            else if (info.vraag != null && (info.tags == null || info.content == null) && !firstTime) // check if all the fields are filled in
                ModelState.AddModelError("", "Vul alle velden in aub.");
            else if (!firstTime)
            {
                // Fields are met hmm let's see if we can find all the tags perhaps :D
                List<string> tagsList = new List<string>(); // new generic list which will contain our tags which we aren't in the database
                info.tags = info.tags.Trim(',', '!', '?', ':', ';', '.');
                string[] tags = info.tags.Split(' '); // assume all tags are splitted by a space (beg)
                if (tags.Count() > 5)
                    ModelState.AddModelError("", " U mag niet meer dan 5 tags meegeven.");
                List<string> foundTags = new List<string>();
                // check if the given tag exits in the datebase
                foreach (string tag in tags)
                {
                    var temp = from taggies in db.Tags
                               where taggies.Name.Contains(tag)
                               select taggies;
                    // if a tag is in the database the above query should find it. Else it is a new one.
                    if (temp.Count() == 0)  // not found add it to the list of new tags
                        tagsList.Add(tag);
                    else // else mark it as one we have already
                        foundTags.Add(tag);
                }

                // get the user information
                var userPosting = from postingUser in db.Users
                                  where postingUser.UserName == User.Identity.Name
                                  join userCombine in db.UserMeta on postingUser.UserID equals userCombine.UserId
                                  select userCombine;
                if (userPosting.Count() != 1)
                {
                    ModelState.AddModelError("", "U bent niet ingelogd."); // aan name dat de join lukt
                    ViewBag.LoggedIn = false;
                }
                // check if we got all new tags filled in and everything is valid
                if ((tagsList.Count() - info.CountTagsSumbitted()) == 0 && ModelState.IsValid)
                {
                    // add the stuff since we are done :D
                    // also check if we have tags to add. If so. Let's add those first (so we can link stuff)
                    int UserID = userPosting.First().UserId;
                    var userPostingMeta = (from usermeta in db.UserMeta
                                           where usermeta.UserId == UserID
                                           select usermeta).Single();

                    // add each new tag to the database
                    for (int i = 0; i < tagsList.Count(); i++)
                    {
                        Tag newTag = new Tag() { Description = info.returnTagContent(i), Name = tagsList.ElementAt(i), Count = 1 };
                        userPostingMeta.Tags += 1;
                        db.Tags.Add(newTag);
                    }
                    // inceremnt the amount of questions that there are with this tag
                    foreach (string tagName in foundTags)
                    {
                        var tagAdd = from tagSelected in db.Tags
                                     where tagSelected.Name.Contains(tagName)
                                     select tagSelected;
                        tagAdd.First().Count += 1;
                    }

                    // add the amount of questions asked by this person with one
                    userPosting.First().Questions += 1;
                    UserMeta userInfo = userPosting.First();
                    // create the question
                    Question newQuestion = new Question() { Title = info.vraag, UserId = userInfo.UserId, Content = info.content };
                    // add it to the db
                    db.Questions.Add(newQuestion);
                    db.SaveChanges(); // to make sure that if there were new tags they are added propperly (so we can query the id's right)

                    // ####################################
                    //     check if we got a new badge
                    // ####################################
                    if (TagBadge.badgeAchieve(userInfo.UserId))
                        TagBadge.awardBadge(userInfo.UserId);
                    if (TagCreatorBadge.badgeAchieve(userInfo.UserId))
                        TagCreatorBadge.awardBadge(userInfo.UserId);
                    if (TagLordBadge.badgeAchieve(userInfo.UserId))
                        TagLordBadge.awardBadge(userInfo.UserId);
                    // ####################################

                    // query back our last question
                    // should be the first of this list
                    var justAsked = from questionAsked in db.Questions
                                    where questionAsked.UserId == userInfo.UserId
                                    orderby questionAsked.Created_At descending
                                    select questionAsked;
                    // query all the id's needed
                    Question justAskedQuestion = justAsked.First();
                    // foreach tag that there in on this question craete a tagID - QuestionID line
                    foreach (string tagje in tags)
                    {
                        // get the id and created an new QuestionTag for it
                        var tagIDPost = from tagIDje in db.Tags
                                        where tagIDje.Name.Contains(tagje)
                                        select tagIDje.TagID;
                        int postTag = tagIDPost.First();

                        QuestionTag newQuestTag = new QuestionTag() { QuestionId = justAskedQuestion.QuestionID, TagId = postTag };
                        db.QuestionTags.Add(newQuestTag);
                    }
                    db.SaveChanges();

                    // #################################
                    //    Check if we got a new badge
                    // #################################
                    if (QuestionBadge.badgeAchieve(userInfo.UserId))
                        QuestionBadge.awardBadge(userInfo.UserId);
                    if (QuestionCreatorBadge.badgeAchieve(userInfo.UserId))
                        QuestionCreatorBadge.awardBadge(userInfo.UserId);
                    if (QuestionLordBadge.badgeAchieve(userInfo.UserId))
                        QuestionLordBadge.awardBadge(userInfo.UserId);
                    // #################################

                    // if we get here we are done :D so take us to our just asked question
                    return RedirectToAction("view", "vraag", new { id = justAskedQuestion.QuestionID });
                }
                else
                {
                    // missing tags :<
                    // create a list for the missing tags :<
                    ViewBag.MissingTagList = tagsList;
                    // give allong a counter (since viewbag is doing nasty and won't let me count :<)
                    ViewBag.MissingTagListCount = tagsList.Count();
                }

            }
            return View();
        }
        /// <summary>
        /// Hashes a string that is url encoded as output.
        /// </summary>
        /// <param name="s">Input string</param>
        /// <returns>Hashed string with url encoding</returns>
        public static string UrlHash(string s)
        {
            // Can't encrypt empty strings
            if (s == null)
                return "";

            // Tansform the string into a byte array
            byte[] hash = encoder.GetBytes(s);

            // Hash the password with SHA512
            hash = shaHasher.ComputeHash(hash);

            // Return as BASE64 string
            HTMLSanitizer hs = new HTMLSanitizer();

            string dummy = hs.UrlEncode(Convert.ToBase64String(hash));
            return dummy.Replace('%', '1');
        }
 public void TestInitialize()
 {
     hs = new HTMLSanitizer();
 }