using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json.Serialization;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Controller.Entities.Audio
{
    /// 
    /// Class Audio
    /// 
    public class Audio : BaseItem,
        IHasAlbumArtist,
        IHasArtist,
        IHasMusicGenres,
        IHasLookupInfo,
        IHasMediaSources
    {
        /// 
        [JsonIgnore]
        public IReadOnlyList Artists { get; set; }
        /// 
        [JsonIgnore]
        public IReadOnlyList AlbumArtists { get; set; }
        public Audio()
        {
            Artists = Array.Empty();
            AlbumArtists = Array.Empty();
        }
        public override double GetDefaultPrimaryImageAspectRatio()
        {
            return 1;
        }
        [JsonIgnore]
        public override bool SupportsPlayedStatus => true;
        [JsonIgnore]
        public override bool SupportsPeople => false;
        [JsonIgnore]
        public override bool SupportsAddingToPlaylist => true;
        [JsonIgnore]
        public override bool SupportsInheritedParentImages => true;
        [JsonIgnore]
        protected override bool SupportsOwnedItems => false;
        [JsonIgnore]
        public override Folder LatestItemsIndexContainer => AlbumEntity;
        public override bool CanDownload()
        {
            return IsFileProtocol;
        }
        [JsonIgnore]
        public MusicAlbum AlbumEntity => FindParent();
        /// 
        /// Gets the type of the media.
        /// 
        /// The type of the media.
        [JsonIgnore]
        public override string MediaType => 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;
        }
        public override List GetUserDataKeys()
        {
            var list = base.GetUserDataKeys();
            var songKey = IndexNumber.HasValue ? IndexNumber.Value.ToString("0000") : string.Empty;
            if (ParentIndexNumber.HasValue)
            {
                songKey = ParentIndexNumber.Value.ToString("0000") + "-" + songKey;
            }
            songKey += Name;
            if (!string.IsNullOrEmpty(Album))
            {
                songKey = Album + "-" + songKey;
            }
            var albumArtist = AlbumArtists.FirstOrDefault();
            if (!string.IsNullOrEmpty(albumArtist))
            {
                songKey = albumArtist + "-" + songKey;
            }
            list.Insert(0, songKey);
            return list;
        }
        public override UnratedItem GetBlockUnratedType()
        {
            if (SourceType == SourceType.Library)
            {
                return UnratedItem.Music;
            }
            return base.GetBlockUnratedType();
        }
        public List GetMediaStreams(MediaStreamType type)
        {
            return MediaSourceManager.GetMediaStreams(new MediaStreamQuery
            {
                ItemId = Id,
                Type = type
            });
        }
        public SongInfo GetLookupInfo()
        {
            var info = GetItemLookupInfo();
            info.AlbumArtists = AlbumArtists;
            info.Album = Album;
            info.Artists = Artists;
            return info;
        }
        protected override List> GetAllItemsForMediaSources()
        {
            var list = new List>();
            list.Add(new Tuple(this, MediaSourceType.Default));
            return list;
        }
    }
}