using System;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Querying;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Channels
{
    public interface IChannelManager
    {
        /// 
        /// Adds the parts.
        /// 
        /// The channels.
        /// The factories.
        void AddParts(IEnumerable channels, IEnumerable factories);
        /// 
        /// Gets the channel download path.
        /// 
        /// The channel download path.
        string ChannelDownloadPath { get; }
        /// 
        /// Gets the channel features.
        /// 
        /// The identifier.
        /// ChannelFeatures.
        ChannelFeatures GetChannelFeatures(string id);
        /// 
        /// Gets all channel features.
        /// 
        /// IEnumerable{ChannelFeatures}.
        IEnumerable GetAllChannelFeatures();
        /// 
        /// Gets the channel.
        /// 
        /// The identifier.
        /// Channel.
        Channel GetChannel(string id);
        /// 
        /// Gets the channels internal.
        /// 
        /// The query.
        /// The cancellation token.
        /// Task<QueryResult<Channel>>.
        Task> GetChannelsInternal(ChannelQuery query, CancellationToken cancellationToken);
        /// 
        /// Gets the channels.
        /// 
        /// The query.
        /// The cancellation token.
        /// Task{QueryResult{BaseItemDto}}.
        Task> GetChannels(ChannelQuery query, CancellationToken cancellationToken);
        /// 
        /// Gets all media internal.
        /// 
        /// The query.
        /// The cancellation token.
        /// Task<QueryResult<BaseItem>>.
        Task> GetAllMediaInternal(AllChannelMediaQuery query, CancellationToken cancellationToken);
        
        /// 
        /// Gets all media.
        /// 
        /// The query.
        /// The cancellation token.
        /// Task{QueryResult{BaseItemDto}}.
        Task> GetAllMedia(AllChannelMediaQuery query, CancellationToken cancellationToken);
        /// 
        /// Gets the latest media.
        /// 
        /// The query.
        /// The cancellation token.
        /// Task{QueryResult{BaseItemDto}}.
        Task> GetLatestChannelItems(AllChannelMediaQuery query, CancellationToken cancellationToken);
        /// 
        /// Gets the latest channel items internal.
        /// 
        /// The query.
        /// The cancellation token.
        /// Task<QueryResult<BaseItem>>.
        Task> GetLatestChannelItemsInternal(AllChannelMediaQuery query, CancellationToken cancellationToken);
        
        /// 
        /// Gets the channel items.
        /// 
        /// The query.
        /// The cancellation token.
        /// Task{QueryResult{BaseItemDto}}.
        Task> GetChannelItems(ChannelItemQuery query, CancellationToken cancellationToken);
        /// 
        /// Gets the channel items internal.
        /// 
        /// The query.
        /// The progress.
        /// The cancellation token.
        /// Task<QueryResult<BaseItem>>.
        Task> GetChannelItemsInternal(ChannelItemQuery query, IProgress progress, CancellationToken cancellationToken);
        /// 
        /// Gets the channel item media sources.
        /// 
        /// The identifier.
        /// if set to true [include dynamic sources].
        /// The cancellation token.
        /// Task{IEnumerable{MediaSourceInfo}}.
        Task> GetChannelItemMediaSources(string id, bool includeDynamicSources, CancellationToken cancellationToken);
        /// 
        /// Gets the channel folder.
        /// 
        /// The user identifier.
        /// The cancellation token.
        /// BaseItemDto.
        Task GetInternalChannelFolder(string userId, CancellationToken cancellationToken);
        /// 
        /// Gets the channel folder.
        /// 
        /// The user identifier.
        /// The cancellation token.
        /// BaseItemDto.
        Task GetChannelFolder(string userId, CancellationToken cancellationToken);
        /// 
        /// Downloads the channel item.
        /// 
        /// The item.
        /// The destination path.
        /// The progress.
        /// The cancellation token.
        /// Task.
        Task DownloadChannelItem(IChannelMediaItem item, string destinationPath, IProgress progress, CancellationToken cancellationToken);
    }
}