using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
namespace MediaBrowser.Controller.Entities.Audio
{
    /// 
    /// Class Audio
    /// 
    public class Audio : BaseItem, IHasMediaStreams, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasLookupInfo
    {
        public string FormatName { get; set; }
        public long? Size { get; set; }
        public string Container { get; set; }
        public int? TotalBitrate { get; set; }
        public Audio()
        {
            Artists = new List();
        }
        /// 
        /// Gets or sets a value indicating whether this instance has embedded image.
        /// 
        /// true if this instance has embedded image; otherwise, false.
        public bool HasEmbeddedImage { get; set; }
        /// 
        /// Override this to true if class should be grouped under a container in indicies
        /// The container class should be defined via IndexContainer
        /// 
        /// true if [group in index]; otherwise, false.
        [IgnoreDataMember]
        public override bool GroupInIndex
        {
            get
            {
                return true;
            }
        }
        /// 
        /// Override this to return the folder that should be used to construct a container
        /// for this item in an index.  GroupInIndex should be true as well.
        /// 
        /// The index container.
        [IgnoreDataMember]
        public override Folder IndexContainer
        {
            get
            {
                return Parents.OfType().FirstOrDefault() ?? new MusicAlbum { Name = "" };
            }
        }
        /// 
        /// Gets or sets the artist.
        /// 
        /// The artist.
        public List Artists { get; set; }
        [IgnoreDataMember]
        public List AllArtists
        {
            get
            {
                var list = new List();
                if (!string.IsNullOrEmpty(AlbumArtist))
                {
                    list.Add(AlbumArtist);
                }
                list.AddRange(Artists);
                return list;
            }
        }
        /// 
        /// Gets or sets the album.
        /// 
        /// The album.
        public string Album { get; set; }
        /// 
        /// Gets or sets the album artist.
        /// 
        /// The album artist.
        public string AlbumArtist { get; set; }
        /// 
        /// Gets the type of the media.
        /// 
        /// The type of the media.
        public override string MediaType
        {
            get
            {
                return Model.Entities.MediaType.Audio;
            }
        }
        /// 
        /// Creates the name of the sort.
        /// 
        /// System.String.
        protected override string CreateSortName()
        {
            return (ParentIndexNumber != null ? ParentIndexNumber.Value.ToString("0000 - ") : "")
                    + (IndexNumber != null ? IndexNumber.Value.ToString("0000 - ") : "") + Name;
        }
        /// 
        /// Determines whether the specified name has artist.
        /// 
        /// The name.
        /// true if the specified name has artist; otherwise, false.
        public bool HasArtist(string name)
        {
            return Artists.Contains(name, StringComparer.OrdinalIgnoreCase) || string.Equals(AlbumArtist, name, StringComparison.OrdinalIgnoreCase);
        }
        /// 
        /// Gets the user data key.
        /// 
        /// System.String.
        public override string GetUserDataKey()
        {
            var parent = FindParent();
            if (parent != null)
            {
                var parentKey = parent.GetUserDataKey();
                if (IndexNumber.HasValue)
                {
                    var songKey = (ParentIndexNumber != null ? ParentIndexNumber.Value.ToString("0000 - ") : "")
                                  + (IndexNumber.Value.ToString("0000 - "));
                    return parentKey + songKey;
                }
            }
            return base.GetUserDataKey();
        }
        protected override bool GetBlockUnratedValue(UserConfiguration config)
        {
            return config.BlockUnratedItems.Contains(UnratedItem.Music);
        }
        public SongInfo GetLookupInfo()
        {
            var info = GetItemLookupInfo();
            info.AlbumArtist = AlbumArtist;
            info.Album = Album;
            info.Artists = Artists;
            return info;
        }
    }
}