using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Common.IO;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.IO;
namespace MediaBrowser.Controller.Entities
{
    public interface IHasImages : IHasProviderIds, IHasId
    {
        /// 
        /// Gets the name.
        /// 
        /// The name.
        string Name { get; set; }
        /// 
        /// Gets the path.
        /// 
        /// The path.
        string Path { get; set; }
        /// 
        /// Gets the file name without extension.
        /// 
        /// The file name without extension.
        string FileNameWithoutExtension { get; }
        /// 
        /// Gets the type of the location.
        /// 
        /// The type of the location.
        LocationType LocationType { get; }
        /// 
        /// Gets the locked fields.
        /// 
        /// The locked fields.
        List LockedFields { get; }
        /// 
        /// Gets the images.
        /// 
        /// Type of the image.
        /// IEnumerable{ItemImageInfo}.
        IEnumerable GetImages(ImageType imageType);
        /// 
        /// Gets the image path.
        /// 
        /// Type of the image.
        /// Index of the image.
        /// System.String.
        string GetImagePath(ImageType imageType, int imageIndex);
        /// 
        /// Gets the image information.
        /// 
        /// Type of the image.
        /// Index of the image.
        /// ItemImageInfo.
        ItemImageInfo GetImageInfo(ImageType imageType, int imageIndex);
        /// 
        /// Sets the image.
        /// 
        /// The type.
        /// The index.
        /// The file.
        void SetImagePath(ImageType type, int index, FileSystemMetadata file);
        /// 
        /// Determines whether the specified type has image.
        /// 
        /// The type.
        /// Index of the image.
        /// true if the specified type has image; otherwise, false.
        bool HasImage(ImageType type, int imageIndex);
        /// 
        /// Allowses the multiple images.
        /// 
        /// The type.
        /// true if XXXX, false otherwise.
        bool AllowsMultipleImages(ImageType type);
        /// 
        /// Swaps the images.
        /// 
        /// The type.
        /// The index1.
        /// The index2.
        /// Task.
        Task SwapImages(ImageType type, int index1, int index2);
        /// 
        /// Gets the display type of the media.
        /// 
        /// The display type of the media.
        string DisplayMediaType { get; set; }
        /// 
        /// Gets or sets the primary image path.
        /// 
        /// The primary image path.
        string PrimaryImagePath { get; }
        /// 
        /// Gets the preferred metadata language.
        /// 
        /// System.String.
        string GetPreferredMetadataLanguage();
        /// 
        /// Validates the images and returns true or false indicating if any were removed.
        /// 
        bool ValidateImages(IDirectoryService directoryService);
        /// 
        /// Gets a value indicating whether this instance is owned item.
        /// 
        /// true if this instance is owned item; otherwise, false.
        bool IsOwnedItem { get; }
        /// 
        /// Gets the containing folder path.
        /// 
        /// The containing folder path.
        string ContainingFolderPath { get; }
        /// 
        /// Adds the images.
        /// 
        /// Type of the image.
        /// The images.
        /// true if XXXX, false otherwise.
        bool AddImages(ImageType imageType, List images);
        /// 
        /// Determines whether [is save local metadata enabled].
        /// 
        /// true if [is save local metadata enabled]; otherwise, false.
        bool IsSaveLocalMetadataEnabled();
        /// 
        /// Gets a value indicating whether [supports local metadata].
        /// 
        /// true if [supports local metadata]; otherwise, false.
        bool SupportsLocalMetadata { get; }
        bool DetectIsInMixedFolder();
        /// 
        /// Gets a value indicating whether this instance is locked.
        /// 
        /// true if this instance is locked; otherwise, false.
        bool IsLocked { get; }
        /// 
        /// Gets a value indicating whether [supports remote image downloading].
        /// 
        /// true if [supports remote image downloading]; otherwise, false.
        bool SupportsRemoteImageDownloading { get; }
        /// 
        /// Gets the internal metadata path.
        /// 
        /// System.String.
        string GetInternalMetadataPath();
        /// 
        /// Gets a value indicating whether [always scan internal metadata path].
        /// 
        /// true if [always scan internal metadata path]; otherwise, false.
        bool AlwaysScanInternalMetadataPath { get; }
        /// 
        /// Determines whether [is internet metadata enabled].
        /// 
        /// true if [is internet metadata enabled]; otherwise, false.
        bool IsInternetMetadataEnabled();
        /// 
        /// Removes the image.
        /// 
        /// The image.
        void RemoveImage(ItemImageInfo image);
        /// 
        /// Updates to repository.
        /// 
        /// The update reason.
        /// The cancellation token.
        /// Task.
        Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken);
        /// 
        /// Sets the image.
        /// 
        /// The image.
        /// The index.
        void SetImage(ItemImageInfo image, int index);
    }
    public static class HasImagesExtensions
    {
        /// 
        /// Gets the image path.
        /// 
        /// The item.
        /// Type of the image.
        /// System.String.
        public static string GetImagePath(this IHasImages item, ImageType imageType)
        {
            return item.GetImagePath(imageType, 0);
        }
        public static bool HasImage(this IHasImages item, ImageType imageType)
        {
            return item.HasImage(imageType, 0);
        }
        /// 
        /// Sets the image path.
        /// 
        /// The item.
        /// Type of the image.
        /// The file.
        public static void SetImagePath(this IHasImages item, ImageType imageType, FileSystemMetadata file)
        {
            item.SetImagePath(imageType, 0, file);
        }
        /// 
        /// Sets the image path.
        /// 
        /// The item.
        /// Type of the image.
        /// The file.
        public static void SetImagePath(this IHasImages item, ImageType imageType, string file)
        {
            if (file.StartsWith("http", System.StringComparison.OrdinalIgnoreCase))
            {
                item.SetImage(new ItemImageInfo
                {
                    Path = file,
                    Type = imageType
                }, 0);
            }
            else
            {
                item.SetImagePath(imageType, BaseItem.FileSystem.GetFileInfo(file));
            }
        }
    }
}