private void LegacySetEpisodeMonitoredStatus(Series series, MonitoringOptions monitoringOptions)
        {
            _logger.Debug("[{0}] Setting episode monitored status.", series.Title);

            var episodes = _episodeService.GetEpisodeBySeries(series.Id);

            if (monitoringOptions.IgnoreEpisodesWithFiles)
            {
                _logger.Debug("Unmonitoring Episodes with Files");
                ToggleEpisodesMonitoredState(episodes.Where(e => e.HasFile), false);
            }
            else
            {
                _logger.Debug("Monitoring Episodes with Files");
                ToggleEpisodesMonitoredState(episodes.Where(e => e.HasFile), true);
            }

            if (monitoringOptions.IgnoreEpisodesWithoutFiles)
            {
                _logger.Debug("Unmonitoring Episodes without Files");
                ToggleEpisodesMonitoredState(episodes.Where(e => !e.HasFile && e.AirDateUtc.HasValue && e.AirDateUtc.Value.Before(DateTime.UtcNow)), false);
            }
            else
            {
                _logger.Debug("Monitoring Episodes without Files");
                ToggleEpisodesMonitoredState(episodes.Where(e => !e.HasFile && e.AirDateUtc.HasValue && e.AirDateUtc.Value.Before(DateTime.UtcNow)), true);
            }

            var lastSeason = series.Seasons.Select(s => s.SeasonNumber).MaxOrDefault();

            foreach (var s in series.Seasons)
            {
                var season = s;

                // If the season is unmonitored we should unmonitor all episodes in that season

                if (!season.Monitored)
                {
                    _logger.Debug("Unmonitoring all episodes in season {0}", season.SeasonNumber);
                    ToggleEpisodesMonitoredState(episodes.Where(e => e.SeasonNumber == season.SeasonNumber), false);
                }

                // If the season is not the latest season and all it's episodes are unmonitored the season will be unmonitored

                if (season.SeasonNumber < lastSeason)
                {
                    if (episodes.Where(e => e.SeasonNumber == season.SeasonNumber).All(e => !e.Monitored))
                    {
                        _logger.Debug("Unmonitoring season {0} because all episodes are not monitored", season.SeasonNumber);
                        season.Monitored = false;
                    }
                }
            }

            _episodeService.UpdateEpisodes(episodes);

            _seriesService.UpdateSeries(series, false);
        }
        public void SetEpisodeMonitoredStatus(Series series, MonitoringOptions monitoringOptions)
        {
            // Update the series without changing the episodes
            if (monitoringOptions == null)
            {
                _seriesService.UpdateSeries(series, false);
                return;
            }

            // Fallback for v2 endpoints
            if (monitoringOptions.Monitor == MonitorTypes.Unknown)
            {
                LegacySetEpisodeMonitoredStatus(series, monitoringOptions);
                return;
            }

            var firstSeason = series.Seasons.Select(s => s.SeasonNumber).Where(s => s > 0).MinOrDefault();
            var lastSeason  = series.Seasons.Select(s => s.SeasonNumber).MaxOrDefault();
            var episodes    = _episodeService.GetEpisodeBySeries(series.Id);

            switch (monitoringOptions.Monitor)
            {
            case MonitorTypes.All:
                _logger.Debug("[{0}] Monitoring all episodes", series.Title);
                ToggleEpisodesMonitoredState(episodes, e => e.SeasonNumber > 0);

                break;

            case MonitorTypes.Future:
                _logger.Debug("[{0}] Monitoring future episodes", series.Title);
                ToggleEpisodesMonitoredState(episodes, e => e.SeasonNumber > 0 && (!e.AirDateUtc.HasValue || e.AirDateUtc >= DateTime.UtcNow));

                break;

            case MonitorTypes.Missing:
                _logger.Debug("[{0}] Monitoring missing episodes", series.Title);
                ToggleEpisodesMonitoredState(episodes, e => e.SeasonNumber > 0 && !e.HasFile);

                break;

            case MonitorTypes.Existing:
                _logger.Debug("[{0}] Monitoring existing episodes", series.Title);
                ToggleEpisodesMonitoredState(episodes, e => e.SeasonNumber > 0 && e.HasFile);

                break;

            case MonitorTypes.Pilot:
                _logger.Debug("[{0}] Monitoring first episode episodes", series.Title);
                ToggleEpisodesMonitoredState(episodes,
                                             e => e.SeasonNumber > 0 && e.SeasonNumber == firstSeason && e.EpisodeNumber == 1);

                break;

            case MonitorTypes.FirstSeason:
                _logger.Debug("[{0}] Monitoring first season episodes", series.Title);
                ToggleEpisodesMonitoredState(episodes, e => e.SeasonNumber > 0 && e.SeasonNumber == firstSeason);

                break;

            case MonitorTypes.LatestSeason:
                if (episodes.Where(e => e.SeasonNumber == lastSeason)
                    .All(e => e.AirDateUtc.HasValue &&
                         e.AirDateUtc.Value.Before(DateTime.UtcNow) &&
                         !e.AirDateUtc.Value.InLastDays(90)))
                {
                    _logger.Debug("[{0}] Unmonitoring all episodes because latest season aired more than 90 days ago", series.Title);
                    ToggleEpisodesMonitoredState(episodes, e => false);
                    break;
                }

                _logger.Debug("[{0}] Monitoring latest season episodes", series.Title);

                ToggleEpisodesMonitoredState(episodes, e => e.SeasonNumber > 0 && e.SeasonNumber == lastSeason);

                break;

            case MonitorTypes.None:
                _logger.Debug("[{0}] Unmonitoring all episodes", series.Title);
                ToggleEpisodesMonitoredState(episodes, e => false);

                break;
            }

            var monitoredSeasons = episodes.Where(e => e.Monitored)
                                   .Select(e => e.SeasonNumber)
                                   .Distinct()
                                   .ToList();

            foreach (var season in series.Seasons)
            {
                var seasonNumber = season.SeasonNumber;

                // Monitor the season when:
                // - Not specials
                // - The latest season
                // - Not only supposed to monitor the first season
                if (seasonNumber > 0 &&
                    seasonNumber == lastSeason &&
                    monitoringOptions.Monitor != MonitorTypes.FirstSeason &&
                    monitoringOptions.Monitor != MonitorTypes.Pilot &&
                    monitoringOptions.Monitor != MonitorTypes.None)
                {
                    season.Monitored = true;
                }
                // Don't monitor season 1 if only the pilot episode is monitored
                else if (seasonNumber == firstSeason && monitoringOptions.Monitor == MonitorTypes.Pilot)
                {
                    season.Monitored = false;
                }
                // Monitor the season if it has any monitor episodes
                else if (monitoredSeasons.Contains(seasonNumber))
                {
                    season.Monitored = true;
                }
                // Don't monitor the season
                else
                {
                    season.Monitored = false;
                }
            }

            _episodeService.UpdateEpisodes(episodes);
            _seriesService.UpdateSeries(series, false);
        }
        public void SetEpisodeMonitoredStatus(Series series, MonitoringOptions monitoringOptions)
        {
            if (monitoringOptions != null)
            {
                _logger.Debug("[{0}] Setting episode monitored status.", series.Title);

                var episodes = _episodeService.GetEpisodeBySeries(series.Id);

                if (monitoringOptions.IgnoreEpisodesWithFiles)
                {
                    _logger.Debug("Ignoring Episodes with Files");
                    ToggleEpisodesMonitoredState(episodes.Where(e => e.HasFile), false);
                }

                else
                {
                    _logger.Debug("Monitoring Episodes with Files");
                    ToggleEpisodesMonitoredState(episodes.Where(e => e.HasFile), true);
                }

                if (monitoringOptions.IgnoreEpisodesWithoutFiles)
                {
                    _logger.Debug("Ignoring Episodes without Files");
                    ToggleEpisodesMonitoredState(episodes.Where(e => !e.HasFile && e.AirDateUtc.HasValue && e.AirDateUtc.Value.Before(DateTime.UtcNow)), false);
                }

                else
                {
                    _logger.Debug("Monitoring Episodes without Files");
                    ToggleEpisodesMonitoredState(episodes.Where(e => !e.HasFile && e.AirDateUtc.HasValue && e.AirDateUtc.Value.Before(DateTime.UtcNow)), true);
                }

                var lastSeason = series.Seasons.Select(s => s.SeasonNumber).MaxOrDefault();

                foreach (var s in series.Seasons)
                {
                    var season = s;

                    if (season.Monitored)
                    {
                        if (!monitoringOptions.IgnoreEpisodesWithFiles && !monitoringOptions.IgnoreEpisodesWithoutFiles)
                        {
                            ToggleEpisodesMonitoredState(episodes.Where(e => e.SeasonNumber == season.SeasonNumber), true);
                        }
                    }

                    else
                    {
                        if (!monitoringOptions.IgnoreEpisodesWithFiles && !monitoringOptions.IgnoreEpisodesWithoutFiles)
                        {
                            ToggleEpisodesMonitoredState(episodes.Where(e => e.SeasonNumber == season.SeasonNumber), false);
                        }

                        else if (season.SeasonNumber == 0)
                        {
                            ToggleEpisodesMonitoredState(episodes.Where(e => e.SeasonNumber == season.SeasonNumber), false);
                        }
                    }

                    if (season.SeasonNumber < lastSeason)
                    {
                        if (episodes.Where(e => e.SeasonNumber == season.SeasonNumber).All(e => !e.Monitored))
                        {
                            season.Monitored = false;
                        }
                    }
                }

                _episodeService.UpdateEpisodes(episodes);
            }

            _seriesService.UpdateSeries(series);
        }
        public void SetEpisodeMonitoredStatus(Series series, MonitoringOptions monitoringOptions)
        {
            if (monitoringOptions != null)
            {
                _logger.Debug("[{0}] Setting episode monitored status.", series.Title);

                var episodes = _episodeService.GetEpisodeBySeries(series.Id);

                if (monitoringOptions.IgnoreEpisodesWithFiles)
                {
                    _logger.Debug("Ignoring Episodes with Files");
                    ToggleEpisodesMonitoredState(episodes.Where(e => e.HasFile), false);
                }

                else
                {
                    _logger.Debug("Monitoring Episodes with Files");
                    ToggleEpisodesMonitoredState(episodes.Where(e => e.HasFile), true);
                }

                if (monitoringOptions.IgnoreEpisodesWithoutFiles)
                {
                    _logger.Debug("Ignoring Episodes without Files");
                    ToggleEpisodesMonitoredState(episodes.Where(e => !e.HasFile && e.AirDateUtc.HasValue && e.AirDateUtc.Value.Before(DateTime.UtcNow)), false);
                }

                else
                {
                    _logger.Debug("Monitoring Episodes without Files");
                    ToggleEpisodesMonitoredState(episodes.Where(e => !e.HasFile && e.AirDateUtc.HasValue && e.AirDateUtc.Value.Before(DateTime.UtcNow)), true);
                }

                var lastSeason = series.Seasons.Select(s => s.SeasonNumber).MaxOrDefault();

                foreach (var s in series.Seasons)
                {
                    var season = s;

                    if (season.Monitored)
                    {
                        if (!monitoringOptions.IgnoreEpisodesWithFiles && !monitoringOptions.IgnoreEpisodesWithoutFiles)
                        {
                            ToggleEpisodesMonitoredState(episodes.Where(e => e.SeasonNumber == season.SeasonNumber), true);
                        }
                    }

                    else
                    {
                        if (!monitoringOptions.IgnoreEpisodesWithFiles && !monitoringOptions.IgnoreEpisodesWithoutFiles)
                        {
                            ToggleEpisodesMonitoredState(episodes.Where(e => e.SeasonNumber == season.SeasonNumber), false);
                        }

                        else if (season.SeasonNumber == 0)
                        {
                            ToggleEpisodesMonitoredState(episodes.Where(e => e.SeasonNumber == season.SeasonNumber), false);
                        }
                    }

                    if (season.SeasonNumber < lastSeason)
                    {
                        if (episodes.Where(e => e.SeasonNumber == season.SeasonNumber).All(e => !e.Monitored))
                        {
                            season.Monitored = false;
                        }
                    }
                }

                _episodeService.UpdateEpisodes(episodes);
            }

            _seriesService.UpdateSeries(series);
        }