using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.MediaInfo;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Entities
{
    /// 
    /// Class Video
    /// 
    public class Video : BaseItem,
        IHasAspectRatio,
        IHasTags,
        ISupportsPlaceHolders,
        IHasMediaSources,
        IHasShortOverview,
        IHasPreferredMetadataLanguage,
        IThemeMedia,
        IArchivable
    {
        public Guid? PrimaryVersionId { get; set; }
        public List AdditionalParts { get; set; }
        public List LocalAlternateVersions { get; set; }
        public List LinkedAlternateVersions { get; set; }
        public bool IsThemeMedia { get; set; }
        public string FormatName { get; set; }
        public long? Size { get; set; }
        public string Container { get; set; }
        public int? TotalBitrate { get; set; }
        public string ShortOverview { get; set; }
        public ExtraType ExtraType { get; set; }
        /// 
        /// Gets or sets the preferred metadata country code.
        /// 
        /// The preferred metadata country code.
        public string PreferredMetadataCountryCode { get; set; }
        public string PreferredMetadataLanguage { get; set; }
        /// 
        /// Gets or sets the timestamp.
        /// 
        /// The timestamp.
        public TransportStreamTimestamp? Timestamp { get; set; }
        public Video()
        {
            PlayableStreamFileNames = new List();
            AdditionalParts = new List();
            LocalAlternateVersions = new List();
            Tags = new List();
            SubtitleFiles = new List();
            LinkedAlternateVersions = new List();
        }
        public override bool CanDownload()
        {
            if (VideoType == VideoType.HdDvd || VideoType == VideoType.Dvd ||
                VideoType == VideoType.BluRay)
            {
                return false;
            }
            var locationType = LocationType;
            return locationType != LocationType.Remote &&
                   locationType != LocationType.Virtual;
        }
        [IgnoreDataMember]
        public override bool SupportsAddingToPlaylist
        {
            get { return LocationType == LocationType.FileSystem && RunTimeTicks.HasValue; }
        }
        [IgnoreDataMember]
        public int MediaSourceCount
        {
            get
            {
                return LinkedAlternateVersions.Count + LocalAlternateVersions.Count + 1;
            }
        }
        [IgnoreDataMember]
        public bool IsStacked
        {
            get { return AdditionalParts.Count > 0; }
        }
        [IgnoreDataMember]
        public bool HasLocalAlternateVersions
        {
            get { return LocalAlternateVersions.Count > 0; }
        }
        [IgnoreDataMember]
        public bool IsArchive
        {
            get
            {
                if (string.IsNullOrWhiteSpace(Path))
                {
                    return false;
                }
                var ext = System.IO.Path.GetExtension(Path) ?? string.Empty;
                return new[] { ".zip", ".rar", ".7z" }.Contains(ext, StringComparer.OrdinalIgnoreCase);
            }
        }
        public IEnumerable GetAdditionalPartIds()
        {
            return AdditionalParts.Select(i => LibraryManager.GetNewItemId(i, typeof(Video)));
        }
        public IEnumerable GetLocalAlternateVersionIds()
        {
            return LocalAlternateVersions.Select(i => LibraryManager.GetNewItemId(i, typeof(Video)));
        }
        /// 
        /// Gets the linked children.
        /// 
        /// IEnumerable{BaseItem}.
        public IEnumerable