using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.LiveTv;
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Linq;
namespace MediaBrowser.Controller.LiveTv
{
    public class LiveTvProgram : BaseItem
    {
        /// 
        /// Gets the user data key.
        /// 
        /// System.String.
        public override string GetUserDataKey()
        {
            return GetClientTypeName() + "-" + Name;
        }
        /// 
        /// Id of the program.
        /// 
        public string ExternalId { get; set; }
        /// 
        /// Gets or sets the channel identifier.
        /// 
        /// The channel identifier.
        public string ExternalChannelId { get; set; }
        /// 
        /// Gets or sets the type of the channel.
        /// 
        /// The type of the channel.
        public ChannelType ChannelType { get; set; }
        /// 
        /// The start date of the program, in UTC.
        /// 
        public DateTime StartDate { get; set; }
        /// 
        /// Gets or sets a value indicating whether this instance is hd.
        /// 
        /// true if this instance is hd; otherwise, false.
        public bool? IsHD { get; set; }
        /// 
        /// Gets or sets the audio.
        /// 
        /// The audio.
        public ProgramAudio? Audio { get; set; }
        /// 
        /// Gets or sets a value indicating whether this instance is repeat.
        /// 
        /// true if this instance is repeat; otherwise, false.
        public bool IsRepeat { get; set; }
        /// 
        /// Gets or sets the episode title.
        /// 
        /// The episode title.
        public string EpisodeTitle { get; set; }
        /// 
        /// Gets or sets the name of the service.
        /// 
        /// The name of the service.
        public string ServiceName { get; set; }
        /// 
        /// Supply the image path if it can be accessed directly from the file system
        /// 
        /// The image path.
        public string ProviderImagePath { get; set; }
        /// 
        /// Supply the image url if it can be downloaded
        /// 
        /// The image URL.
        public string ProviderImageUrl { get; set; }
        /// 
        /// Gets or sets a value indicating whether this instance has image.
        /// 
        /// null if [has image] contains no value, true if [has image]; otherwise, false.
        public bool? HasProviderImage { get; set; }
        /// 
        /// Gets or sets a value indicating whether this instance is movie.
        /// 
        /// true if this instance is movie; otherwise, false.
        public bool IsMovie { get; set; }
        /// 
        /// Gets or sets a value indicating whether this instance is sports.
        /// 
        /// true if this instance is sports; otherwise, false.
        public bool IsSports { get; set; }
        /// 
        /// Gets or sets a value indicating whether this instance is series.
        /// 
        /// true if this instance is series; otherwise, false.
        public bool IsSeries { get; set; }
        /// 
        /// Gets or sets a value indicating whether this instance is live.
        /// 
        /// true if this instance is live; otherwise, false.
        public bool IsLive { get; set; }
        /// 
        /// Gets or sets a value indicating whether this instance is news.
        /// 
        /// true if this instance is news; otherwise, false.
        public bool IsNews { get; set; }
        /// 
        /// Gets or sets a value indicating whether this instance is kids.
        /// 
        /// true if this instance is kids; otherwise, false.
        public bool IsKids { get; set; }
        /// 
        /// Gets or sets a value indicating whether this instance is premiere.
        /// 
        /// true if this instance is premiere; otherwise, false.
        public bool IsPremiere { get; set; }
        /// 
        /// Returns the folder containing the item.
        /// If the item is a folder, it returns the folder itself
        /// 
        /// The containing folder path.
        public override string ContainingFolderPath
        {
            get
            {
                return Path;
            }
        }
        /// 
        /// Gets a value indicating whether this instance is owned item.
        /// 
        /// true if this instance is owned item; otherwise, false.
        public override bool IsOwnedItem
        {
            get
            {
                return false;
            }
        }
        public override string MediaType
        {
            get
            {
                return ChannelType == ChannelType.TV ? Model.Entities.MediaType.Video : Model.Entities.MediaType.Audio;
            }
        }
        public bool IsAiring
        {
            get
            {
                var now = DateTime.UtcNow;
                return now >= StartDate && now < EndDate;
            }
        }
        public bool HasAired
        {
            get
            {
                var now = DateTime.UtcNow;
                return now >= EndDate;
            }
        }
        public override string GetClientTypeName()
        {
            return "Program";
        }
        public override Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken)
        {
            DateLastSaved = DateTime.UtcNow;
            
            // Avoid library manager and keep out of in-memory cache
            // Not great that this class has to know about that, but we'll improve that later.
            return ItemRepository.SaveItem(this, cancellationToken);
        }
        protected override bool GetBlockUnratedValue(UserConfiguration config)
        {
            return config.BlockUnratedItems.Contains(UnratedItem.LiveTvProgram);
        }
    }
}