using System;
using System.Collections.Generic;
using System.Linq;
using Ninject;
using NLog;
using NzbDrone.Core.Repository.Quality;
using PetaPoco;

namespace NzbDrone.Core.Providers
{
    public class QualityProvider
    {
        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
        private readonly IDatabase _database;

        public QualityProvider()
        {
        }

        [Inject]
        public QualityProvider(IDatabase database)
        {
            _database = database;
        }

        public virtual int Add(QualityProfile profile)
        {
            return Convert.ToInt32(_database.Insert(profile));
        }

        public virtual void Update(QualityProfile profile)
        {
            if (!_database.Exists<QualityProfile>("WHERE QualityProfileid = @0", profile.QualityProfileId))
            {
                Logger.Error("Unable to update non-existing profile");
                throw new InvalidOperationException("Unable to update non-existing profile");
            }

            _database.Update(profile);
        }

        public virtual void Delete(int profileId)
        {
            _database.Delete<QualityProfile>(profileId);
        }

        public virtual List<QualityProfile> All()
        {
            var profiles = _database.Fetch<QualityProfile>().ToList();

            return profiles;
        }

        public virtual QualityProfile Get(int profileId)
        {
            return _database.Single<QualityProfile>(profileId);
        }

        public virtual void SetupDefaultProfiles()
        {
            if (All().Count != 0)
                return;

            Logger.Info("Setting up default quality profiles");

            var sd = new QualityProfile { Name = "SD", Allowed = new List<QualityTypes> { QualityTypes.SDTV, QualityTypes.DVD }, Cutoff = QualityTypes.SDTV };

            var hd = new QualityProfile
            {
                Name = "HD",
                Allowed = new List<QualityTypes> { QualityTypes.HDTV, QualityTypes.WEBDL, QualityTypes.Bluray720p },
                Cutoff = QualityTypes.HDTV
            };

            Add(sd);
            Add(hd);

        }
    }
}