using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Providers;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Providers
{
    /// 
    /// Interface IProviderManager
    /// 
    public interface IProviderManager
    {
        /// 
        /// Executes the metadata providers.
        /// 
        /// The item.
        /// The cancellation token.
        /// if set to true [force].
        /// if set to true [allow slow providers].
        /// Task{System.Boolean}.
        Task ExecuteMetadataProviders(BaseItem item, CancellationToken cancellationToken, bool force = false, bool allowSlowProviders = true);
        /// 
        /// Saves the image.
        /// 
        /// The item.
        /// The URL.
        /// The resource pool.
        /// The type.
        /// Index of the image.
        /// The cancellation token.
        /// Task.
        Task SaveImage(BaseItem item, string url, SemaphoreSlim resourcePool, ImageType type, int? imageIndex, CancellationToken cancellationToken);
        /// 
        /// Saves the image.
        /// 
        /// The item.
        /// The source.
        /// Type of the MIME.
        /// The type.
        /// Index of the image.
        /// The source URL.
        /// The cancellation token.
        /// Task.
        Task SaveImage(BaseItem item, Stream source, string mimeType, ImageType type, int? imageIndex, string sourceUrl, CancellationToken cancellationToken);
        /// 
        /// Adds the metadata providers.
        /// 
        /// The providers.
        /// The image providers.
        void AddParts(IEnumerable providers, IEnumerable imageProviders);
        /// 
        /// Gets the available remote images.
        /// 
        /// The item.
        /// The cancellation token.
        /// Name of the provider.
        /// The type.
        /// Task{IEnumerable{RemoteImageInfo}}.
        Task> GetAvailableRemoteImages(BaseItem item, CancellationToken cancellationToken, string providerName = null, ImageType? type = null);
        /// 
        /// Gets the image providers.
        /// 
        /// The item.
        /// IEnumerable{IImageProvider}.
        IEnumerable GetImageProviders(BaseItem item);
    }
}