using MediaBrowser.Common.Serialization;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Plugins.Trailers.Entities;
using System;
using System.ComponentModel.Composition;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Plugins.Trailers.Providers
{
    /// 
    /// Class TrailerFromJsonProvider
    /// 
    [Export(typeof(BaseMetadataProvider))]
    class TrailerFromJsonProvider : BaseMetadataProvider
    {
        /// 
        /// Supportses the specified item.
        /// 
        /// The item.
        /// true if XXXX, false otherwise
        public override bool Supports(BaseItem item)
        {
            var trailer = item as Trailer;
            return trailer != null && trailer.Parent is TrailerCollectionFolder;
        }
        /// 
        /// Override this to return the date that should be compared to the last refresh date
        /// to determine if this provider should be re-fetched.
        /// 
        /// The item.
        /// DateTime.
        protected override DateTime CompareDate(BaseItem item)
        {
            var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "trailer.json"));
            return entry != null ? entry.Value.LastWriteTimeUtc : DateTime.MinValue;
        }
        /// 
        /// Fetches metadata and returns true or false indicating if any work that requires persistence was done
        /// 
        /// The item.
        /// if set to true [force].
        /// Task{System.Boolean}.
        protected override Task FetchAsyncInternal(BaseItem item, bool force, CancellationToken cancellationToken)
        {
            return Task.Run(() => Fetch((Trailer)item));
        }
        /// 
        /// Fetches the specified item.
        /// 
        /// The item.
        /// true if XXXX, false otherwise
        private bool Fetch(Trailer item)
        {
            var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "trailer.json"));
            if (metadataFile.HasValue)
            {
                var tempTrailer = JsonSerializer.DeserializeFromFile(metadataFile.Value.Path);
                ImportMetdata(tempTrailer, item);
                SetLastRefreshed(item, DateTime.UtcNow);
                return true;
            }
            return false;
        }
        /// 
        /// Gets the priority.
        /// 
        /// The priority.
        public override MetadataProviderPriority Priority
        {
            get { return MetadataProviderPriority.First; }
        }
        /// 
        /// Imports the metdata.
        /// 
        /// The source.
        /// The target.
        private void ImportMetdata(Trailer source, Trailer target)
        {
            if (!string.IsNullOrWhiteSpace(source.Name))
            {
                target.Name = source.Name;
            }
            if (source.RunTimeTicks.HasValue)
            {
                target.RunTimeTicks = source.RunTimeTicks;
            }
            if (source.Genres != null)
            {
                foreach (var entry in source.Genres)
                {
                    target.AddGenre(entry);
                }
            }
            if (!string.IsNullOrWhiteSpace(source.OfficialRating))
            {
                target.OfficialRating = source.OfficialRating;
            }
            if (!string.IsNullOrWhiteSpace(source.Overview))
            {
                target.Overview = source.Overview;
            }
            if (source.People != null)
            {
                target.AddPeople(source.People);
            }
            if (source.PremiereDate.HasValue)
            {
                target.PremiereDate = source.PremiereDate;
            }
            if (source.ProductionYear.HasValue)
            {
                target.ProductionYear = source.ProductionYear;
            }
            if (source.Studios != null)
            {
                foreach (var entry in source.Studios)
                {
                    target.AddStudio(entry);
                }
            }
        }
    }
}