public JsonResult DeleteSelectedReviews(List <Guid> selectedReviewsIds)
        {
            if (selectedReviewsIds == null)
            {
                return(Json(false));
            }
            try
            {
                using (var context = new rkDBContext())
                {
                    foreach (var id in selectedReviewsIds)
                    {
                        var reviewToDelete = context.Reviews.SingleOrDefault(x => x.Id == id);

                        context.Reviews.Remove(reviewToDelete);
                        context.SaveChanges();

                        var fullImagePath = Request.MapPath("~/Images/ReviewImages/" + id + ".png");
                        if (System.IO.File.Exists(fullImagePath))
                        {
                            System.IO.File.Delete(fullImagePath);
                        }
                    }
                }
            }
            catch
            {
                return(Json(false));
            }
            return(Json(true));
        }
        // GET: User
        public ActionResult Index()
        {
            if (Session["userId"] == null)
            {
                return(RedirectToAction("Index", "Home"));
            }

            var userId = (Guid)Session["userId"];

            try
            {
                using (var context = new rkDBContext())
                {
                    var thisUser = context.Users.SingleOrDefault(x => x.Id == userId);

                    var user = new UserViewModel
                    {
                        Firstname        = thisUser?.FirstName,
                        Lastname         = thisUser?.LastName,
                        Username         = thisUser?.Username,
                        Email            = thisUser?.Email,
                        ProfileImagePath = userId.ToString() + ".png"
                    };

                    return(View(user));
                }
            }
            catch
            {
                return(View("Error"));
            }
        }
        public JsonResult GoToSearchedUser(string userName)
        {
            var currentUsername = Session["userName"].ToString();
            var searchedUserId  = Guid.Empty;

            var succeeded = 0;

            try
            {
                using (var context = new rkDBContext())
                {
                    if (context.Users.Any(x => x.Username == userName))
                    {
                        succeeded      = 1;
                        searchedUserId =
                            context.Users.Where(x => x.Username == userName).Select(x => x.Id).SingleOrDefault();
                    }
                }
            }
            catch
            {
                return(Json(new { currentUsername, searchedUserId, succeeded }));
            }
            return(Json(new
            {
                currentUsername,
                searchedUserId,
                succeeded
            }));
        }
        public JsonResult GetReviewRatings(Guid reviewId)
        {
            int succeeded = 0;

            List <RatingViewModel> ratingsToReview = null;

            try
            {
                using (var context = new rkDBContext())
                {
                    var userToReviewList = context.UserToReviews.Where(x => x.ReviewId == reviewId).ToList();

                    ratingsToReview = userToReviewList.Select(userToReview => new RatingViewModel
                    {
                        Username = userToReview.User.Username,
                        Rating   = userToReview.Rating
                    }).ToList();
                }
            }
            catch
            {
                succeeded = 2;
                return(Json(new { succeeded, ratingsToReview }));
            }

            if (ratingsToReview?.Count > 0)
            {
                succeeded = 1;
            }


            return(Json(new { succeeded, ratingsToReview }));
        }
        public ActionResult ChangeUserPassword(PasswordViewModel passwordViewModel)
        {
            if (Session["userId"] == null)
            {
                return(RedirectToAction("Index", "Home"));
            }
            if (!ModelState.IsValid)
            {
                return(View("EditPassword"));
            }

            try
            {
                using (var context = new rkDBContext())
                {
                    var userId = (Guid)Session["userId"];
                    var user   = context.Users.SingleOrDefault(x => x.Id == userId);
                    if (user == null)
                    {
                        return(RedirectToAction("Login", "Account"));
                    }

                    string hashedPassword;
                    var    accController = new AccountController();

                    using (var md5Data = MD5.Create())
                    {
                        hashedPassword = accController.GetMd5Hash(md5Data, passwordViewModel.OldPassword + user.Salt);
                    }

                    if (context.Users.Any(x => x.Id == userId && x.Password == hashedPassword))
                    {
                        string newHashedPassword;

                        using (var md5Data = MD5.Create())
                        {
                            newHashedPassword = accController.GetMd5Hash(md5Data,
                                                                         passwordViewModel.NewPassword + user.Salt);
                        }
                        user.Password = newHashedPassword;
                    }
                    else
                    {
                        ModelState.AddModelError("WrongCredentialsError", "You submitted the wrong password, try again.");
                        return(View("EditPassword"));
                    }

                    context.Entry(user).State = System.Data.Entity.EntityState.Modified;
                    context.SaveChanges();
                }
                return(RedirectToAction("Index", "User"));
            }
            catch
            {
                return(RedirectToAction("Error", "Home"));
            }
        }
        public ActionResult UpdateUser(UserViewModel userViewModel)
        {
            if (Session["userId"] == null)
            {
                return(RedirectToAction("Index", "Home"));
            }
            if (!ModelState.IsValid)
            {
                EditUser();
                return(View("EditUser"));
            }
            try
            {
                using (var context = new rkDBContext())
                {
                    var userId = (Guid)Session["userId"];

                    var userToEdit = context.Users.SingleOrDefault(x => x.Id == userId);



                    if (
                        context.Users.Any(
                            x =>
                            x.Username == userViewModel.Username && x.Id != userId ||
                            x.Email == userViewModel.Email && x.Id != userId))
                    {
                        ModelState.AddModelError("AlreadyExistsError",
                                                 "Username or Email already exists, please choose something else");
                        //return View("EditUser");
                        return(View("EditUser", userViewModel));
                    }

                    if (userToEdit == null)
                    {
                        return(RedirectToAction("Index", "User"));
                    }

                    userToEdit.FirstName = userViewModel.Firstname;
                    userToEdit.LastName  = userViewModel.Lastname;
                    userToEdit.Email     = userViewModel.Email;
                    userToEdit.Username  = userViewModel.Username;

                    Session["userName"] = userToEdit.Username;

                    context.Entry(userToEdit).State = System.Data.Entity.EntityState.Modified;

                    context.SaveChanges();
                }
                return(RedirectToAction("Index", "User"));
            }
            catch
            {
                return(RedirectToAction("Error", "Home"));
            }
        }
        public ActionResult ShowReview(Guid?reviewId)
        {
            if (Session["userId"] == null)
            {
                return(RedirectToAction("Index", "Home"));
            }
            if (reviewId == null)
            {
                return(RedirectToAction("Reviews", "Review"));
            }
            try
            {
                using (var context = new rkDBContext())
                {
                    var reviewRating =
                        CalculateReviewRating(context.UserToReviews.Where(x => x.ReviewId == reviewId).ToList());

                    var reviewToShow = context.Reviews.Where(x => x.Id == reviewId).Select(x => new AllReviewsViewModel
                    {
                        Title           = x.Title,
                        CreatorUserId   = x.CreatorUserId,
                        CreatedBy       = x.User.Username,
                        UserRating      = x.UserRating,
                        ReviewId        = x.Id,
                        Description     = x.Description,
                        DisLikes        = x.DislikeCount,
                        Likes           = x.LikeCount,
                        TotalRating     = (decimal)reviewRating,
                        Type            = x.Type,
                        ReviewImagePath = reviewId.ToString() + ".png"
                    }).FirstOrDefault();

                    var reviewComments =
                        context.CommentToReviews.OrderByDescending(x => x.CreatedDate)
                        .Where(x => x.ReviewId == reviewId)
                        .ToList();
                    foreach (var item in reviewComments)
                    {
                        var commentToAdd = new CommentToReview
                        {
                            Id          = item.Id,
                            ReviewId    = item.ReviewId,
                            Comment     = item.Comment,
                            CreatedDate = item.CreatedDate,
                            User        = context.Users.SingleOrDefault(x => x.Id == item.UserId)
                        };
                        reviewToShow?.CommentToReviewList.Add(commentToAdd);
                    }
                    return(reviewToShow == null?View("Error") : View(reviewToShow));
                }
            }
            catch
            {
                return(RedirectToAction("Error", "Home"));
            }
        }
        public JsonResult RateReview(int checkedValue, Guid reviewId)
        {
            var succeeded = checkedValue;
            var userId    = (Guid)Session["userId"];

            try
            {
                using (var context = new rkDBContext())
                {
                    if (!context.Users.Any(x => x.Id == userId))
                    {
                        succeeded = 6;
                        return(Json(new { succeeded }));
                    }

                    var isValid      = context.UserToReviews.Any(x => x.UserId == userId && x.ReviewId == reviewId);
                    var userToReview =
                        context.UserToReviews.SingleOrDefault(x => x.UserId == userId && x.ReviewId == reviewId);

                    if (isValid && userToReview != null)
                    {
                        userToReview.Rating = checkedValue;

                        context.SaveChanges();
                    }
                    else if (!isValid)
                    {
                        var newUserToReview = new UserToReview
                        {
                            Id       = Guid.NewGuid(),
                            UserId   = userId,
                            ReviewId = reviewId,
                            HasLiked = false,
                            Rating   = checkedValue
                        };

                        context.UserToReviews.Add(newUserToReview);
                        context.SaveChanges();
                    }
                    else
                    {
                        succeeded = 0;
                    }
                    return(Json(new
                    {
                        succeeded,
                        rating = CalculateReviewRating(context.UserToReviews.Where(x => x.ReviewId == reviewId).ToList())
                    }));
                }
            }
            catch
            {
                succeeded = 6;
                return(Json(new { succeeded }));
            }
        }
        public ActionResult RegisterUser(RegisterViewModel newUserToRegister)
        {
            if (!ModelState.IsValid)
            {
                return(View("Register"));
            }

            try
            {
                using (var context = new rkDBContext())
                {
                    if (
                        context.Users.Any(
                            x => x.Username == newUserToRegister.Username || x.Email == newUserToRegister.Email))
                    {
                        ModelState.AddModelError("ExistsError",
                                                 "Username or Email already exist, please choose something else.");
                        return(View("Register"));
                    }

                    // Hash pw and generate salt for it.
                    var    newUserId = Guid.NewGuid();
                    string hashedAndSaltedPassword;
                    var    salt = GenerateSalt();
                    using (var md5Hash = MD5.Create())
                    {
                        hashedAndSaltedPassword = GetMd5Hash(md5Hash, newUserToRegister.Password + salt);
                    }

                    var newUser = new User
                    {
                        Id        = newUserId,
                        FirstName = newUserToRegister.Firstname,
                        LastName  = newUserToRegister.Lastname,
                        Username  = newUserToRegister.Username,
                        Password  = hashedAndSaltedPassword,
                        Email     = newUserToRegister.Email,
                        Salt      = salt
                    };

                    context.Users.Add(newUser);
                    context.SaveChanges();

                    ModelState.Clear();
                }
            }
            catch
            {
                return(RedirectToAction("Error", "Home"));
            }

            return(RedirectToAction("Login", "Account"));
        }
        public ActionResult CreateNewReview(ReviewViewModel reviewViewModel)
        {
            if (Session["userId"] == null)
            {
                return(RedirectToAction("Index", "Home"));
            }
            if (!ModelState.IsValid || reviewViewModel.UserRating == 0)
            {
                ModelState.AddModelError("RatingError", "You have to set a rating.");
                var returnModel = new ReviewViewModel();

                return(View("NewReview", returnModel));
            }

            if (Session["userId"] == null)
            {
                return(RedirectToAction("Index", "Home"));
            }

            var currentUserId = (Guid)Session["userId"];

            try
            {
                using (var context = new rkDBContext())
                {
                    var newReview = new Review
                    {
                        Id            = Guid.NewGuid(),
                        CreatorUserId = currentUserId,
                        Title         = reviewViewModel.Title,
                        Description   = reviewViewModel.Description,
                        Type          = reviewViewModel.Type,
                        UserRating    = reviewViewModel.UserRating,
                        CreatedDate   = DateTime.Now
                    };

                    UploadPicture(newReview.Id);

                    context.Reviews.Add(newReview);
                    context.SaveChanges();
                }
            }
            catch
            {
                return(RedirectToAction("Error", "Home"));
            }
            return(RedirectToAction("Index", "Review"));
        }
        public ActionResult DifferentUser(Guid?creatorUserId)
        {
            if (Session["userId"] == null)
            {
                return(RedirectToAction("Index", "Home"));
            }
            if (creatorUserId == null)
            {
                return(RedirectToAction("Index", "Home"));
            }

            try
            {
                using (var context = new rkDBContext())
                {
                    var user = context.Users.Where(x => x.Id == creatorUserId).Select(x => new UserViewModel
                    {
                        Username         = x.Username,
                        Firstname        = x.FirstName,
                        Lastname         = x.LastName,
                        Email            = x.Email,
                        ProfileImagePath = x.Id.ToString() + ".png"
                    }).SingleOrDefault();

                    var userReviews = context.Reviews.Where(x => x.CreatorUserId == creatorUserId).ToList();
                    foreach (var userReview in userReviews)
                    {
                        var reviewToAdd = new ReviewViewModel
                        {
                            ReviewId    = userReview.Id,
                            Title       = userReview.Title,
                            Description = userReview.Description,
                            CreatedDate = userReview.CreatedDate.ToShortDateString(),
                            Type        = userReview.Type,
                            UserRating  = userReview.UserRating,
                        };

                        user?.ReviewViewModelList.Add(reviewToAdd);
                    }

                    return(user == null?View("Error") : View(user));
                }
            }
            catch
            {
                return(View("Error"));
            }
        }
        public JsonResult CreateCommentToReview(AllReviewsViewModel allReviewsViewModel)
        {
            var succeeded = false;

            if (!ModelState.IsValid)
            {
                return(Json(allReviewsViewModel));
            }

            try
            {
                using (var context = new rkDBContext())
                {
                    var userId = (Guid)Session["userId"];

                    if (context.Users.Any(x => x.Id == userId))
                    {
                        var user = context.Users.SingleOrDefault(x => x.Id == userId);

                        var newCommentToReview = new CommentToReview
                        {
                            Id          = Guid.NewGuid(),
                            ReviewId    = allReviewsViewModel.ReviewId,
                            UserId      = (Guid)userId,
                            Comment     = allReviewsViewModel.CommentToAdd,
                            CreatedDate = DateTime.Now
                        };
                        allReviewsViewModel.CreatedBy   = user?.Username;
                        allReviewsViewModel.CreatedDate = DateTime.Now.ToShortDateString();

                        context.CommentToReviews.Add(newCommentToReview);
                        succeeded = true;
                        context.SaveChanges();
                    }
                    else
                    {
                        return(Json(new { succeeded }));
                    }
                }
            }
            catch
            {
                return(Json(new { succeeded }));
            }
            return(Json(new { succeeded, allReviewsViewModel }));
        }
        public JsonResult SearchReviews(string searchValue)
        {
            var succeeded = false;

            var reviews = new List <AllReviewsViewModel>();

            try
            {
                using (var context = new rkDBContext())
                {
                    if (!context.Reviews.Any(x => x.Title == searchValue))
                    {
                        return(Json(new { reviews, succeeded }));
                    }

                    succeeded = true;

                    var reviewsToShow = context.Reviews.Where(x => x.Title == searchValue).ToList();

                    reviews.AddRange(from review in reviewsToShow
                                     let user = context.Users.SingleOrDefault(x => x.Id == review.CreatorUserId)
                                                select new AllReviewsViewModel
                    {
                        Title             = review.Title,
                        Type              = review.Type,
                        ReviewId          = review.Id,
                        Likes             = review.LikeCount,
                        UserRating        = review.UserRating,
                        DisLikes          = review.DislikeCount,
                        Description       = review.Description,
                        CreatedBy         = review.User.Username,
                        TotalRating       = review.ReviewRating,
                        CreatorUserId     = review.CreatorUserId,
                        CreatedDate       = review.CreatedDate.ToShortDateString(),
                        HasProfilePicture = ConfirmProfilePicture(user.Id)
                    });
                }
            }
            catch
            {
                return(Json(new { reviews, succeeded }));
            }
            return(Json(new { reviews, succeeded }));
        }
        public ActionResult EditUser()
        {
            if (Session["userId"] == null)
            {
                return(RedirectToAction("Index", "Home"));
            }
            UserViewModel userViewModelToReturn = null;

            try
            {
                using (var context = new rkDBContext())
                {
                    Guid userId;
                    if (Session["userId"] != null)
                    {
                        userId = (Guid)Session["userId"];
                    }
                    else
                    {
                        return(RedirectToAction("Index", "Home"));
                    }

                    var user = context.Users.SingleOrDefault(x => x.Id == userId);

                    if (user != null)
                    {
                        userViewModelToReturn = new UserViewModel
                        {
                            Firstname        = user.FirstName,
                            Lastname         = user.LastName,
                            Email            = user.Email,
                            Username         = user.Username,
                            ProfileImagePath = user.Id.ToString() + ".png",
                        }
                    }
                    ;
                }
                return(userViewModelToReturn == null?View("Error") : View(userViewModelToReturn));
            }
            catch
            {
                return(View("Error"));
            }
        }
        public JsonResult SearchUsers()
        {
            List <string> userList  = null;
            int           succeeded = 0;

            try
            {
                using (var context = new rkDBContext())
                {
                    userList = context.Users.Select(x => x.Username).ToList();
                }
            }
            catch
            {
                return(Json(new { succeeded, userList }));
            }
            succeeded = 1;
            return(Json(new { succeeded, userList }));
        }
        public ActionResult UserLogin(LoginViewModel userToLogin)
        {
            if (!ModelState.IsValid)
            {
                return(View("Login"));
            }
            try
            {
                using (var context = new rkDBContext())
                {
                    // Get salt for current user
                    string userSalt =
                        context.Users.Where(x => x.Username == userToLogin.Username)
                        .Select(x => x.Salt)
                        .FirstOrDefault();

                    string hashedPassword;
                    using (var md5Hash = MD5.Create())
                    {
                        hashedPassword = GetMd5Hash(md5Hash, userToLogin.Password + userSalt);
                    }

                    if (context.Users.Any(x => x.Username == userToLogin.Username && x.Password == hashedPassword))
                    {
                        FormsAuthentication.SetAuthCookie(userToLogin.Username, false);
                        var userId = context.Users.Where(
                            x => x.Username == userToLogin.Username && x.Password == hashedPassword)
                                     .Select(x => x.Id).FirstOrDefault();
                        Session["userId"]   = userId;
                        Session["userName"] = userToLogin.Username;

                        return(RedirectToAction("Reviews", "Review"));
                    }
                    ModelState.AddModelError("CredentialError", "Wrong username or password.");
                    return(View("Login"));
                }
            }
            catch
            {
                return(View("Error"));
            }
        }
        public ActionResult EditReview(Guid?reviewId)
        {
            if (Session["userId"] == null)
            {
                return(RedirectToAction("Index", "Home"));
            }
            if (reviewId == null)
            {
                return(RedirectToAction("Index", "Review"));
            }
            var userId = (Guid)Session["userId"];

            try
            {
                using (var context = new rkDBContext())
                {
                    var review = context.Reviews.FirstOrDefault(c => c.Id == reviewId);
                    if (userId != review?.CreatorUserId)
                    {
                        return(View("Error"));
                    }

                    var reviewToEdit = context.Reviews.Where(x => x.Id == reviewId).Select(x => new ReviewViewModel
                    {
                        Title           = x.Title,
                        Description     = x.Description,
                        Type            = x.Type,
                        UserRating      = x.UserRating,
                        ReviewId        = x.Id,
                        ReviewImagePath = reviewId.ToString() + ".png"
                    }).SingleOrDefault();

                    return(reviewToEdit == null?View("Error") : View(reviewToEdit));
                }
            }
            catch
            {
                return(RedirectToAction("Error", "Home"));
            }
        }
        public ActionResult EditSelectedReview(ReviewViewModel reviewViewModel)
        {
            if (Session["userId"] == null)
            {
                return(RedirectToAction("Index", "Home"));
            }
            if (!ModelState.IsValid)
            {
                return(View("Index", "Reviews"));
            }
            try
            {
                using (var context = new rkDBContext())
                {
                    var reviewToUpdate = context.Reviews.SingleOrDefault(x => x.Id == reviewViewModel.ReviewId);

                    if (reviewToUpdate != null)
                    {
                        reviewToUpdate.Title       = reviewViewModel.Title;
                        reviewToUpdate.Description = reviewViewModel.Description;
                        reviewToUpdate.Type        = reviewViewModel.Type;
                        reviewToUpdate.UserRating  = reviewViewModel.UserRating;
                    }
                    else
                    {
                        return(RedirectToAction("Error", "Home"));
                    }

                    context.SaveChanges();
                }
            }
            catch
            {
                return(RedirectToAction("Error", "Home"));
            }
            return(RedirectToAction("Index", "Review"));
        }
        // GET: Review
        public ActionResult Index()
        {
            if (Session["userId"] == null)
            {
                return(RedirectToAction("Login", "Account"));
            }

            var           userId = (Guid)Session["userId"];
            List <Review> allUserReviews;

            try
            {
                using (var context = new rkDBContext())
                {
                    allUserReviews = context.Reviews.Where(x => x.CreatorUserId == userId).ToList();
                }


                var reviewList = allUserReviews.Select(review => new ReviewViewModel
                {
                    ReviewId    = review.Id,
                    Title       = review.Title,
                    Description = review.Description,
                    CreatedDate = review.CreatedDate.ToShortDateString(),
                    UserRating  = review.UserRating,
                    Type        = review.Type,
                }).ToList();


                return(View(reviewList));
            }
            catch
            {
                return(RedirectToAction("Error", "Home"));
            }
        }
        public ActionResult DeleteUser()
        {
            var userId = (Guid)Session["userId"];

            try
            {
                using (var context = new rkDBContext())
                {
                    var userToDelete = context.Users.SingleOrDefault(x => x.Id == userId);

                    var reviewsToDelete = context.Reviews.Where(x => x.CreatorUserId == userId).ToList();

                    // Go through all reviews where "userToDelete" is owner
                    foreach (var review in reviewsToDelete)
                    {
                        // Remove all comments from "userToDelete"'s reviews.
                        var commentToReviewToDelete = context.CommentToReviews.Where(x => x.UserId == userId).ToList();

                        foreach (var commentToReview in commentToReviewToDelete)
                        {
                            context.CommentToReviews.Remove(commentToReview);
                        }

                        // Remove HasLiked, Ratings etc.
                        var userToReviewToRemove = context.UserToReviews.Where(x => x.UserId == userId).ToList();

                        foreach (var userToReview in userToReviewToRemove)
                        {
                            context.UserToReviews.Remove(userToReview);
                        }

                        // Remove review.
                        context.Reviews.Remove(review);
                    }

                    // Remove "userId"'s comments
                    var commentsByUser = context.CommentToReviews.Where(x => x.UserId == userId).ToList();

                    foreach (var comment in commentsByUser)
                    {
                        context.CommentToReviews.Remove(comment);
                    }

                    // Remove "userId"'s ratings
                    var likesOrDislikesByUser = context.UserToReviews.Where(x => x.UserId == userId).ToList();

                    foreach (var likeOrDislikeByUser in likesOrDislikesByUser)
                    {
                        context.UserToReviews.Remove(likeOrDislikeByUser);
                    }

                    // Remove user
                    context.Users.Remove(userToDelete);
                    context.SaveChanges();
                }

                var fullPath = Request.MapPath("~/Images/ProfileImages/" + userId + ".png");
                if (System.IO.File.Exists(fullPath))
                {
                    System.IO.File.Delete(fullPath);
                }

                FormsAuthentication.SignOut();
                Session["userId"] = null;
                return(RedirectToAction("Index", "Home"));
            }
            catch
            {
                return(RedirectToAction("Error", "Home"));
            }
        }
        public JsonResult SortReviews(int sortValue)
        {
            var succeeded = false;

            var reviews = new List <AllReviewsViewModel>();

            try
            {
                using (var context = new rkDBContext())
                {
                    succeeded = true;

                    var reviewsToShow = context.Reviews.ToList();

                    reviews.AddRange(from review in reviewsToShow
                                     let user = context.Users.SingleOrDefault(x => x.Id == review.CreatorUserId)
                                                select new AllReviewsViewModel
                    {
                        Title             = review.Title,
                        Type              = review.Type,
                        ReviewId          = review.Id,
                        Likes             = review.LikeCount,
                        UserRating        = review.UserRating,
                        DisLikes          = review.DislikeCount,
                        Description       = review.Description,
                        CreatedBy         = review.User.Username,
                        TotalRating       = review.ReviewRating,
                        CreatorUserId     = review.CreatorUserId,
                        CreatedDate       = review.CreatedDate.ToShortDateString(),
                        HasProfilePicture = ConfirmProfilePicture(user.Id)
                    });
                }
            }
            catch
            {
                return(Json(new { succeeded, reviews }));
            }
            switch (sortValue)
            {
            case 1:
                reviews = reviews.OrderBy(x => x.Title).ToList();
                break;

            case 2:
                reviews = reviews.OrderBy(x => x.UserRating).ToList();
                break;

            case 3:
                reviews = reviews.OrderBy(x => x.Likes).ToList();
                break;

            case 4:
                reviews = reviews.OrderBy(x => x.DisLikes).ToList();
                break;

            case 5:
                reviews = reviews.OrderBy(x => x.CreatedDate).ToList();
                break;

            case 6:
                reviews = reviews.OrderBy(x => x.Type).ToList();
                break;
            }
            return(Json(new { succeeded, reviews }));
        }
        public ActionResult Reviews()
        {
            if (Session["userId"] == null)
            {
                return(RedirectToAction("Index", "Home"));
            }

            var currentUserId = (Guid)Session["userId"];

            try
            {
                using (var context = new rkDBContext())
                {
                    var allReviews = context.Reviews.ToList();

                    if (allReviews.Count <= 0)
                    {
                        return(View());
                    }
                    var allReviewsViewModelList = new List <AllReviewsViewModel>();
                    foreach (var review in allReviews)
                    {
                        // Fetch userinfo
                        var reviewAuthor = context.Users.FirstOrDefault(x => x.Id == review.CreatorUserId);

                        // Calculate totalRating
                        var userToReviewList = context.UserToReviews.Where(x => x.ReviewId == review.Id).ToList();

                        var calculateReviewRating = CalculateReviewRating(userToReviewList);
                        if (calculateReviewRating == null)
                        {
                            continue;
                        }
                        var totalRating = (decimal)calculateReviewRating;

                        // Fill AllReviewsViewModel with reviewValue to send it to the view
                        if (reviewAuthor == null)
                        {
                            return(View(allReviewsViewModelList));
                        }
                        var reviewToAdd = new AllReviewsViewModel
                        {
                            ReviewId          = review.Id,
                            CreatorUserId     = reviewAuthor.Id,
                            CreatedBy         = reviewAuthor.Username,
                            Title             = review.Title,
                            CreatedDate       = review.CreatedDate.ToShortDateString(),
                            Description       = review.Description,
                            DisLikes          = review.DislikeCount,
                            Likes             = review.LikeCount,
                            TotalRating       = totalRating,
                            UserRating        = review.UserRating,
                            HasProfilePicture = ConfirmProfilePicture(reviewAuthor.Id),
                            Type = review.Type
                        };

                        allReviewsViewModelList.Add(reviewToAdd);
                    }
                    return(View(allReviewsViewModelList));
                }
            }
            catch
            {
                return(RedirectToAction("Error", "Home"));
            }
        }
        public JsonResult LikeOrDislikeReview(int likeOrDislike, Guid reviewId)
        {
            var succeeded = 0;
            var userId    = (Guid)Session["userId"];

            if (likeOrDislike == 1)
            {
                try
                {
                    using (var context = new rkDBContext())
                    {
                        if (!context.Users.Any(x => x.Id == userId))
                        {
                            succeeded = 3;
                            return(Json(succeeded));
                        }

                        var isValid      = context.UserToReviews.Any(x => x.UserId == userId && x.ReviewId == reviewId);
                        var userToReview =
                            context.UserToReviews.SingleOrDefault(x => x.UserId == userId && x.ReviewId == reviewId);

                        if (!isValid)
                        {
                            succeeded = 1;
                            var userHasLiked = new UserToReview
                            {
                                Id       = Guid.NewGuid(),
                                UserId   = userId,
                                ReviewId = reviewId,
                                HasLiked = true
                            };

                            var reviewToLike = context.Reviews.SingleOrDefault(x => x.Id == reviewId);

                            if (reviewToLike != null)
                            {
                                reviewToLike.LikeCount++;
                            }

                            context.UserToReviews.Add(userHasLiked);
                            context.SaveChanges();
                        }
                        else if (userToReview != null && userToReview.HasLiked != true)
                        {
                            succeeded = 1;
                            var reviewToLike = context.Reviews.SingleOrDefault(x => x.Id == reviewId);

                            if (reviewToLike != null)
                            {
                                reviewToLike.LikeCount++;
                            }
                            userToReview.HasLiked = true;

                            context.SaveChanges();
                        }
                        else
                        {
                            return(Json(succeeded));
                        }
                    }
                }
                catch
                {
                    return(Json(succeeded));
                }
                return(Json(succeeded));
            }

            try
            {
                using (var context = new rkDBContext())
                {
                    if (!context.Users.Any(x => x.Id == userId))
                    {
                        succeeded = 3;
                        return(Json(succeeded));
                    }

                    var isValid      = context.UserToReviews.Any(x => x.UserId == userId && x.ReviewId == reviewId);
                    var userToReview =
                        context.UserToReviews.SingleOrDefault(x => x.UserId == userId && x.ReviewId == reviewId);

                    if (userToReview != null && !isValid)
                    {
                        succeeded = 2;

                        var userHasLiked = new UserToReview
                        {
                            Id       = Guid.NewGuid(),
                            UserId   = userId,
                            ReviewId = reviewId,
                            HasLiked = true
                        };
                        var reviewToDislike = context.Reviews.SingleOrDefault(x => x.Id == reviewId);

                        if (reviewToDislike != null)
                        {
                            reviewToDislike.DislikeCount++;
                        }
                        userToReview.HasLiked = true;

                        context.SaveChanges();
                    }
                    else if (userToReview != null && userToReview.HasLiked != true)
                    {
                        succeeded = 2;

                        var reviewToDislike = context.Reviews.SingleOrDefault(x => x.Id == reviewId);

                        if (reviewToDislike != null)
                        {
                            reviewToDislike.DislikeCount++;
                        }
                        userToReview.HasLiked = true;

                        context.SaveChanges();
                    }
                    else
                    {
                        return(Json(succeeded));
                    }
                }
            }
            catch
            {
                return(Json(succeeded));
            }
            return(Json(succeeded));
        }