using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Security;
using System.Text;
using System.Threading;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Persistence;
namespace MediaBrowser.LocalMetadata.Savers
{
    public class EpisodeXmlSaver : IMetadataFileSaver
    {
        private readonly IItemRepository _itemRepository;
        private readonly CultureInfo _usCulture = new CultureInfo("en-US");
        public EpisodeXmlSaver(IItemRepository itemRepository)
        {
            _itemRepository = itemRepository;
        }
        /// 
        /// Determines whether [is enabled for] [the specified item].
        /// 
        /// The item.
        /// Type of the update.
        /// true if [is enabled for] [the specified item]; otherwise, false.
        public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
        {
            if (!item.SupportsLocalMetadata)
            {
                return false;
            }
            return item is Episode && updateType >= ItemUpdateType.MetadataDownload;
        }
        public string Name
        {
            get
            {
                return "Media Browser Xml";
            }
        }
        /// 
        /// Saves the specified item.
        /// 
        /// The item.
        /// The cancellation token.
        /// Task.
        public void Save(IHasMetadata item, CancellationToken cancellationToken)
        {
            var episode = (Episode)item;
            var builder = new StringBuilder();
            builder.Append("- ");
            if (!string.IsNullOrEmpty(item.Name))
            {
                builder.Append("" + SecurityElement.Escape(episode.Name) + "");
            }
            if (episode.IndexNumber.HasValue)
            {
                builder.Append("" + SecurityElement.Escape(episode.IndexNumber.Value.ToString(_usCulture)) + "");
            }
            if (episode.IndexNumberEnd.HasValue)
            {
                builder.Append("" + SecurityElement.Escape(episode.IndexNumberEnd.Value.ToString(_usCulture)) + "");
            }
            if (episode.AirsAfterSeasonNumber.HasValue)
            {
                builder.Append("" + SecurityElement.Escape(episode.AirsAfterSeasonNumber.Value.ToString(_usCulture)) + "");
            }
            if (episode.AirsBeforeEpisodeNumber.HasValue)
            {
                builder.Append("" + SecurityElement.Escape(episode.AirsBeforeEpisodeNumber.Value.ToString(_usCulture)) + "");
            }
            if (episode.AirsBeforeSeasonNumber.HasValue)
            {
                builder.Append("" + SecurityElement.Escape(episode.AirsBeforeSeasonNumber.Value.ToString(_usCulture)) + "");
            }
   
            if (episode.ParentIndexNumber.HasValue)
            {
                builder.Append("" + SecurityElement.Escape(episode.ParentIndexNumber.Value.ToString(_usCulture)) + "");
            }
            if (episode.AbsoluteEpisodeNumber.HasValue)
            {
                builder.Append("" + SecurityElement.Escape(episode.AbsoluteEpisodeNumber.Value.ToString(_usCulture)) + "");
            }
            
            if (episode.DvdEpisodeNumber.HasValue)
            {
                builder.Append("" + SecurityElement.Escape(episode.DvdEpisodeNumber.Value.ToString(_usCulture)) + "");
            }
            if (episode.DvdSeasonNumber.HasValue)
            {
                builder.Append("" + SecurityElement.Escape(episode.DvdSeasonNumber.Value.ToString(_usCulture)) + "");
            } 
            
            if (episode.PremiereDate.HasValue)
            {
                builder.Append("" + SecurityElement.Escape(episode.PremiereDate.Value.ToLocalTime().ToString("yyyy-MM-dd")) + "");
            }
            XmlSaverHelpers.AddCommonNodes(episode, builder);
            XmlSaverHelpers.AddMediaInfo(episode, builder, _itemRepository);
            builder.Append("");
            var xmlFilePath = GetSavePath(item);
            XmlSaverHelpers.Save(builder, xmlFilePath, new List
                {
                    "FirstAired",
                    "SeasonNumber",
                    "EpisodeNumber",
                    "EpisodeName",
                    "EpisodeNumberEnd",
                    "airsafter_season",
                    "airsbefore_episode",
                    "airsbefore_season",
                    "DVD_episodenumber",
                    "DVD_season",
                    "absolute_number"
                });
        }
        /// 
        /// Gets the save path.
        /// 
        /// The item.
        /// System.String.
        public string GetSavePath(IHasMetadata item)
        {
            var filename = Path.ChangeExtension(Path.GetFileName(item.Path), ".xml");
            return Path.Combine(Path.GetDirectoryName(item.Path), "metadata", filename);
        }
    }
}