using System.Collections.Generic; using System.Linq; using NzbDrone.Core.DecisionEngine.Specifications.Search; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Model; namespace NzbDrone.Core.DecisionEngine { public interface IMakeDownloadDecision { IEnumerable GetRssDecision(IEnumerable episodeParseResults); IEnumerable GetSearchDecision(IEnumerable episodeParseResult, SearchDefinitionBase searchDefinitionBase); } public class DownloadDecisionMaker : IMakeDownloadDecision { private readonly IEnumerable _specifications; public DownloadDecisionMaker(IEnumerable specifications) { _specifications = specifications; } public IEnumerable GetRssDecision(IEnumerable episodeParseResults) { foreach (var parseResult in episodeParseResults) { parseResult.Decision = new DownloadDecision(parseResult, GetGeneralRejectionReasons(parseResult).ToArray()); yield return parseResult.Decision; } } public IEnumerable GetSearchDecision(IEnumerable episodeParseResults, SearchDefinitionBase searchDefinitionBase) { foreach (var parseResult in episodeParseResults) { var generalReasons = GetGeneralRejectionReasons(parseResult); var searchReasons = GetSearchRejectionReasons(parseResult, searchDefinitionBase); parseResult.Decision = new DownloadDecision(parseResult, generalReasons.Union(searchReasons).ToArray()); yield return parseResult.Decision; } } private IEnumerable GetGeneralRejectionReasons(IndexerParseResult indexerParseResult) { return _specifications .OfType() .Where(spec => !spec.IsSatisfiedBy(indexerParseResult)) .Select(spec => spec.RejectionReason); } private IEnumerable GetSearchRejectionReasons(IndexerParseResult indexerParseResult, SearchDefinitionBase searchDefinitionBase) { return _specifications .OfType() .Where(spec => !spec.IsSatisfiedBy(indexerParseResult, searchDefinitionBase)) .Select(spec => spec.RejectionReason); } } }