using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Kyoo.Abstractions.Models;
using Microsoft.AspNetCore.Mvc;
namespace Kyoo.Abstractions.Controllers
{
///
/// A service to abstract the file system to allow custom file systems
/// (like distant file systems or external providers).
///
public interface IFileSystem
{
// TODO find a way to handle Transmux/Transcode with this system.
///
/// Used for http queries returning a file. This should be used to return local files
/// or proxy them from a distant server.
///
///
/// If no file exists at the given path or if the path is null, a NotFoundResult is returned
/// to handle it gracefully.
///
/// The path of the file.
///
/// Should the file be downloaded at once or is the client allowed to request only part of the file
///
///
/// You can manually specify the content type of your file.
/// For example you can force a file to be returned as plain text using text/plain.
/// If the type is not specified, it will be deduced automatically (from the extension or by sniffing the file).
///
/// An representing the file returned.
public IActionResult FileResult([CanBeNull] string path, bool rangeSupport = false, string type = null);
///
/// Read a file present at . The reader can be used in an arbitrary context.
/// To return files from an http endpoint, use .
///
/// The path of the file
/// If the file could not be found.
/// A reader to read the file.
public Task GetReader([NotNull] string path);
///
/// Read a file present at . The reader can be used in an arbitrary context.
/// To return files from an http endpoint, use .
///
/// The path of the file
/// The mime type of the opened file.
/// If the file could not be found.
/// A reader to read the file.
public Task GetReader([NotNull] string path, AsyncRef mime);
///
/// Create a new file at .
///
/// The path of the new file.
/// A writer to write to the new file.
public Task NewFile([NotNull] string path);
///
/// Create a new directory at the given path
///
/// The path of the directory
/// The path of the newly created directory is returned.
public Task CreateDirectory([NotNull] string path);
///
/// Combine multiple paths.
///
/// The paths to combine
/// The combined path.
public string Combine(params string[] paths);
///
/// List files in a directory.
///
/// The path of the directory
/// Should the search be recursive or not.
/// A list of files's path.
public Task> ListFiles([NotNull] string path,
SearchOption options = SearchOption.TopDirectoryOnly);
///
/// Check if a file exists at the given path.
///
/// The path to check
/// True if the path exists, false otherwise
public Task Exists([NotNull] string path);
///
/// Get the extra directory of a resource .
/// This method is in this system to allow a filesystem to use a different metadata policy for one.
/// It can be useful if the filesystem is readonly.
///
/// The resource to proceed
/// The type of the resource.
/// The extra directory of the resource.
public Task GetExtraDirectory([NotNull] T resource);
}
}