using System;
using System.Linq;
using NLog;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Model;

namespace NzbDrone.Core.DecisionEngine
{
    public class UpgradeDiskSpecification
    {
        private readonly QualityUpgradeSpecification _qualityUpgradeSpecification;
        private static readonly Logger logger = LogManager.GetCurrentClassLogger();

        public UpgradeDiskSpecification(QualityUpgradeSpecification qualityUpgradeSpecification)
        {
            _qualityUpgradeSpecification = qualityUpgradeSpecification;
        }

        public UpgradeDiskSpecification()
        {
        }

        public virtual bool IsSatisfiedBy(EpisodeParseResult subject)
        {
            foreach (var file in subject.Episodes.Select(c => c.EpisodeFile).Where(c => c != null))
            {
                logger.Trace("Comparing file quality with report. Existing file is {0} proper:{1}", file.Quality, file.Proper);
                if (!_qualityUpgradeSpecification.IsSatisfiedBy(new QualityModel { Quality = file.Quality, Proper = file.Proper }, subject.Quality, subject.Series.QualityProfile.Cutoff))
                    return false;

                if(subject.Quality.Proper && file.DateAdded < DateTime.Today.AddDays(-7))
                {
                    logger.Trace("Proper for old file, skipping: {0}", subject);
                    return false;
                }
            }

            return true;
        }
    }
}