/// <summary>
        /// holt user zu session aus cookie
        /// </summary>
        /// <returns>User zu Session</returns>
        protected User GetSignedInUser()
        {
            var userName = Request.Cookies["moviedbsiteusername"];
            var provider = new Provider.MongoDbProvider();

            return(provider.GetUser(userName));
        }
        public IActionResult Index(UserLoginViewModel userViewModel)
        {
            //Wenn kein model -> eigentlich technischer Fehler
            if (userViewModel == null)
            {
                userViewModel.NonTechnicalError = Const.ErrorConst.UnvollstaendigerUser;
                return(View("Index", userViewModel));
            }

            //User suchen
            var dbProvider = new Provider.MongoDbProvider();
            var userFromDb = dbProvider.GetUser(userViewModel.User.Name);

            //User nicht gefunden -> Fehler
            if (userFromDb == null)
            {
                userViewModel.NonTechnicalError = Const.ErrorConst.UngueltigerUserOderPwd;
                return(View("Index", userViewModel));
            }

            //Password passt nicht -> gleicher Fehler
            if (Provider.CryptoProvider.ComputeSha256Hash(userViewModel.User.Password)
                != userFromDb.Password)
            {
                userViewModel.NonTechnicalError = Const.ErrorConst.UngueltigerUserOderPwd;
                return(View("Index", userViewModel));
            }
            //Usercookie setzen
            SetUserCookie(userViewModel.User.Name);

            //Weiter zu Bucketlists
            return(Redirect("~/Home/BucketListOverview"));
        }
        public Models.MovieViewModel GetMovieViewModel(ObjectId movieId, ObjectId bucketListId, Models.User signedInUser)
        {
            var provider       = new Provider.MongoDbProvider();
            var movieViewModel = new Models.MovieViewModel();

            movieViewModel.movieDetails = provider.GetByObjectId <Models.MovieModel>(movieId, Const.MongoDbConst.CollectionMovies);
            movieViewModel.SignedInUser = signedInUser;

            //wenn Movie aus bucketlist kommt
            if (bucketListId != null)
            {
                movieViewModel.InvolvedUsers = provider.GetUsersFromBucketList(bucketListId);
            }

            return(movieViewModel);
        }
        public IActionResult CreateUser(UserLoginViewModel newUser)
        {
            var dbProvider = new Provider.MongoDbProvider();

            if (dbProvider.GetUser(newUser.User.Name) != null)
            {
                newUser.NonTechnicalError = Const.ErrorConst.NutzerExistiertSchon;
                return(View("CreateUser", newUser));
            }

            //Passwort hashen -> minimal security
            newUser.User.Password = Provider.CryptoProvider.ComputeSha256Hash(newUser.User.Password);

            dbProvider.AddAsync <User>(newUser.User, Const.MongoDbConst.CollectionUsers).Wait();
            SetUserCookie(newUser.User.Name);

            return(Redirect("Index"));
        }
        public void SetMovieWatchedStatus(string movieId, bool isSetToWatched)
        {
            var signedInUser = GetSignedInUser();

            if(signedInUser == null)
            {
                return;
            }

            var provider = new Provider.MongoDbProvider();
            var movieObjId = new MongoDB.Bson.ObjectId(movieId);
            
            if (isSetToWatched)
            {
                provider.AddSeenMovieToUser(movieObjId, signedInUser.Id);
            }
            else
            {
                provider.RemoveSeenMovieFromUser(movieObjId, signedInUser.Id);
            }
        }
        public ActionResult SaveBucketList([FromBody]BucketListMinCreateModel saveModel)
        {
            //Leeres Model -> Bad Request
            if(saveModel == null)
            {
                return StatusCode(400);
            }

            var dbProvider = new Provider.MongoDbProvider();
            var movProvider = new Provider.MovieDetailProvider();
            BucketList bucketListToSave;
            List<User> existingUsers = new List<User>();
            List<ObjectId> previousUsers = new List<ObjectId>();
            bool isNewList = saveModel.ListId.All(s => s == '0');

            //ListId ist nur 0 -> neue id -> neue Liste
            if (isNewList){
                bucketListToSave = new BucketList();
            }
            else
            {
                //Aktuelle Bucketlist lesen -> Beweis, dass sie existiert
                bucketListToSave = dbProvider.GetBucketList(new MongoDB.Bson.ObjectId(saveModel.ListId));
            }

            ///(neuen) Titel setzen 
            bucketListToSave.Name = saveModel.ListTitle;

            //gucken, welche Nutzer existieren
            foreach (var userId in saveModel.UserIds)
            {
                var tmpUser = dbProvider.GetByObjectId<User>(new MongoDB.Bson.ObjectId(userId), Const.MongoDbConst.CollectionUsers);
                if(tmpUser != null)
                {
                    existingUsers.Add(tmpUser);
                }
            }

            //alle vorherigen nutzer merken -> müssen mit neuen abgeglichen werden und fehlende entfernen
            previousUsers = new List<ObjectId>(bucketListToSave.UsersInListId);

            //Liste leer machen
            bucketListToSave.UsersInListId.Clear();
            //Alle Ids existierender User hinzufügen
            bucketListToSave.UsersInListId.AddRange(existingUsers.Select(m => m.Id));

            //Usern Liste zuweisen

            bucketListToSave.MoviesToWatchIds.Clear();
            foreach(var movieId in saveModel.MovieImdbIds)
            {
                //suche Film in DB
                var tmpMovie = dbProvider.GetMovieByImdbId(movieId);
                //muss angelegt werden
                if(tmpMovie == null)
                {
                    //Film aus API lesen
                    tmpMovie = movProvider.GetMovieModelByImdbId(movieId);
                    //eigene Id setzen
                    tmpMovie.Id = MongoDB.Bson.ObjectId.GenerateNewId();
                    //Film in eingener MongoDb ablegen
                    dbProvider.AddAsync<MovieModel>(tmpMovie, Const.MongoDbConst.CollectionMovies).Wait();
                }

                //Id wieder an Bucketlist anhängen
                bucketListToSave.MoviesToWatchIds.Add(tmpMovie.Id);
            }

            if (isNewList)
            {
                //neue Id setzen für bucketlist
                bucketListToSave.ListId = MongoDB.Bson.ObjectId.GenerateNewId();
                //BucketList schreiben
                dbProvider.AddAsync<BucketList>(bucketListToSave, Const.MongoDbConst.CollectionBucketList).Wait();
            }
            else
            {
                dbProvider.ReplaceBucketList(bucketListToSave).Wait();
            }

            ObjectId bucketlistId = bucketListToSave.ListId;

            //Allen Usern der Bucketlist diese zuweisen
            foreach(var userId in bucketListToSave.UsersInListId)
            {
                dbProvider.AddBucketListToUser(userId, bucketlistId);
            }

            //alle User, die rausfliegen unhooken
            foreach (var userId in bucketListToSave.UsersInListId.Where(u => !previousUsers.Contains(u)))
            {
                dbProvider.RemoveBucketListFromUser(userId, bucketlistId);
            }

            return StatusCode(202, bucketlistId.ToString());
        }
        public String GetExistingUser(string userName)
        {
            var provider = new Provider.MongoDbProvider();

            return provider.GetUser(userName)?.ToString() ?? String.Empty;
        }