public async Task <ResponseDto <BaseModelDto> > AddSeasonToWatched(int seasonId, string userId)
        {
            var response = new ResponseDto <BaseModelDto>();

            var watchedEpisodes = _episodeRepository.GetAllBy(x => x.SeasonId == seasonId);
            List <UserWatchedEpisode> userWatchedEpisodesList = new List <UserWatchedEpisode>();

            foreach (var episode in watchedEpisodes)
            {
                UserWatchedEpisode watchedEpisode = new UserWatchedEpisode();
                watchedEpisode.EpisodeId = episode.Id;
                watchedEpisode.UserId    = userId;


                if (await _userWatchedEpisodeRepository.ExistAsync(x =>
                                                                   x.EpisodeId == episode.Id && x.UserId == userId) == false)
                {
                    userWatchedEpisodesList.Add(watchedEpisode);
                }
            }

            foreach (var episode in userWatchedEpisodesList)
            {
                var result = await _userWatchedEpisodeRepository.AddAsync(episode);

                if (!result)
                {
                    response.AddError(Model.Episode, Error.watchedTvShow_Adding);
                    return(response);
                }
            }

            return(response);
        }
        public async Task <ResponseDto <BaseModelDto> > AddUserFavouriteTvSeries(int episodeId, string userId)
        {
            var response = new ResponseDto <BaseModelDto>();

            var episodeExists = await _episodeRepository.ExistAsync(x => x.Id == episodeId);

            if (!episodeExists)
            {
                response.AddError(Model.TvShow, Error.tvShow_NotFound);
                return(response);
            }

            var watchedTvSeriesInDb = await _userWatchedEpisodeRepository.GetByAsync(x => x.EpisodeId == episodeId && x.UserId == userId);

            if (watchedTvSeriesInDb != null)
            {
                response.AddError(Model.WatchedEpisode, Error.watchedEpisode_Already_Exists);
                return(response);
            }

            UserWatchedEpisode watchedEpisode = new UserWatchedEpisode();

            watchedEpisode.CreateDateTime = DateTime.Now;
            watchedEpisode.EpisodeId      = episodeId;
            watchedEpisode.UserId         = userId;

            var result = await _userWatchedEpisodeRepository.AddAsync(watchedEpisode);

            if (!result)
            {
                response.AddError(Model.FavouriteTvShow, Error.favouriteTvShow_Adding);
                return(response);
            }
            else
            {
                AddNotificationBindingModel addNotificationBindingModel = new AddNotificationBindingModel();
                addNotificationBindingModel.Type = "watchedEpisode";

                var episode = await _episodeRepository.GetByAsync(x => x.Id == episodeId, x => x.Season.TvShow);

                addNotificationBindingModel.EpisodeNumber = episode.EpisodeNumber;

                await _notificationService.AddNotification(addNotificationBindingModel, episode.Season.TvShow.Id, userId);
            }

            return(response);
        }
        public async Task <ResponseDto <BaseModelDto> > MarkSeasonAsNotWatched(int seasonId, string userId)
        {
            var response = new ResponseDto <BaseModelDto>();

            var watchedEpisodes = _episodeRepository.GetAllBy(x => x.SeasonId == seasonId);

            List <UserWatchedEpisode> episodesListToRemove = new List <UserWatchedEpisode>();

            foreach (var episode in watchedEpisodes)
            {
                UserWatchedEpisode watchedEpisode = new UserWatchedEpisode();
                watchedEpisode.EpisodeId = episode.Id;
                watchedEpisode.UserId    = userId;


                if (await _userWatchedEpisodeRepository.ExistAsync(x =>
                                                                   x.EpisodeId == episode.Id && x.UserId == userId) == true)
                {
                    episodesListToRemove.Add(watchedEpisode);
                }
            }

            foreach (var episode in episodesListToRemove)
            {
                var ep = await _userWatchedEpisodeRepository.GetByAsync(x => x.EpisodeId == episode.EpisodeId);

                var result = await _userWatchedEpisodeRepository.Remove(ep);

                if (!result)
                {
                    response.AddError(Model.Episode, Error.watchedEpisode_Deleting);
                    return(response);
                }
            }

            return(response);
        }