using ServiceStack.Web;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Net
{
    /// 
    /// Interface IHttpResultFactory
    /// 
    public interface IHttpResultFactory
    {
        /// 
        /// Throws the error.
        /// 
        /// The status code.
        /// The error message.
        /// The response headers.
        void ThrowError(int statusCode, string errorMessage, IDictionary responseHeaders = null);
        
        /// 
        /// Gets the result.
        /// 
        /// The content.
        /// Type of the content.
        /// The response headers.
        /// System.Object.
        object GetResult(object content, string contentType, IDictionary responseHeaders = null);
        /// 
        /// Gets the optimized result.
        /// 
        /// 
        /// The request context.
        /// The result.
        /// The response headers.
        /// System.Object.
        object GetOptimizedResult(IRequest requestContext, T result, IDictionary responseHeaders = null)
            where T : class;
        /// 
        /// Gets the optimized result using cache.
        /// 
        /// 
        /// The request context.
        /// The cache key.
        /// The last date modified.
        /// Duration of the cache.
        /// The factory function that creates the response object.
        /// The response headers.
        /// System.Object.
        object GetOptimizedResultUsingCache(IRequest requestContext, Guid cacheKey, DateTime? lastDateModified, TimeSpan? cacheDuration, Func factoryFn, IDictionary responseHeaders = null)
            where T : class;
        /// 
        /// Gets the cached result.
        /// 
        /// 
        /// The request context.
        /// The cache key.
        /// The last date modified.
        /// Duration of the cache.
        /// The factory fn.
        /// Type of the content.
        /// The response headers.
        /// System.Object.
        object GetCachedResult(IRequest requestContext, Guid cacheKey, DateTime? lastDateModified, TimeSpan? cacheDuration, Func factoryFn, string contentType, IDictionary responseHeaders = null)
            where T : class;
        /// 
        /// Gets the static result.
        /// 
        /// The request context.
        /// The cache key.
        /// The last date modified.
        /// Duration of the cache.
        /// Type of the content.
        /// The factory fn.
        /// The response headers.
        /// if set to true [is head request].
        /// System.Object.
        object GetStaticResult(IRequest requestContext, 
            Guid cacheKey, 
            DateTime? lastDateModified,
            TimeSpan? cacheDuration, 
            string contentType, Func> factoryFn,
            IDictionary responseHeaders = null,
            bool isHeadRequest = false);
        /// 
        /// Gets the static result.
        /// 
        /// The request context.
        /// The options.
        /// System.Object.
        object GetStaticResult(IRequest requestContext, StaticResultOptions options);
        /// 
        /// Gets the static file result.
        /// 
        /// The request context.
        /// The path.
        /// The file share.
        /// System.Object.
        object GetStaticFileResult(IRequest requestContext, string path, FileShare fileShare = FileShare.Read);
        /// 
        /// Gets the static file result.
        /// 
        /// The request context.
        /// The options.
        /// System.Object.
        object GetStaticFileResult(IRequest requestContext, 
            StaticFileResultOptions options);
    }
}