using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
namespace gehGassi.Core.Interfaces
{
///
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Dateien ermöglicht
///
public interface IFileService
{
///
/// Speichern einer Datei in einen Container
///
/// Name des Containers
/// Dateiname (inkl. Pfad, wenn gewünscht)
/// Datei als Byte-Array
/// Überschreiben vorhandener Daten
/// Absoluter Dateiname
Task StoreAsync(string containerName, string filename, byte[] file, bool overwrite = true);
///
/// Speichern einer Datei in einen Container
///
/// Name des Containers
/// Dateiname (inkl. Pfad, wenn gewünscht)
/// Datei als Stream
/// Überschreiben vorhandener Daten
/// Absoluter Dateiname
Task StoreAsync(string containerName, string filename, Stream fileStream, bool overwrite = true);
///
/// Umbenennen einer Datei in einem Container
///
/// Name des Containers
/// Dateiname (inkl. Pfad, wenn gewünscht)
/// Neuer Dateiname
Task RenameAsync(string containerName, string filename, string newFilename);
///
/// Gibt eine Datei zurück
///
/// Name des Containers
/// Dateiname (inkl. Pfad, wenn gewünscht)
/// Datei als Byte-Array
Task GetAsync(string containerName, string filename);
///
/// Gibt eine Datei zurück
///
/// Name des Containers
/// Dateiname (inkl. Pfad, wenn gewünscht)
/// Datei als Stream
Task GetAsStreamAsync(string containerName, string filename);
///
/// Löschen einer Datei in einem Container
///
/// Name des Containers
/// Dateiname (inkl. Pfad, wenn gewünscht)
Task DeleteAsync(string containerName, string filename);
///
/// Gibt eine Liste aller Dateien eines Containers zurück die sich in einem Directory befinden
///
/// Name des Containers
/// Verzeichnis.
/// Teil eines Dateinamens für die suche
/// Liste von Dateien
Task> ListFilesAsync(string containerName, string directory = "", string fileNamePart = "");
///
/// Gibt eine Liste aller Verzeichnise zurück die sich im Container befindne
///
/// Name des Containers
/// wenn angegeben, wird von dem Verzeihnis als root ausgegangen
///
Task> ListDirectoriesAsync(string containerName, string root = "");
///
/// Koperien von Dateinen eines Containers in einen anderen
///
/// Quellcontainer
/// Quellpfad
/// ZielContainer
/// ZielPfad
Task CopyFilesAsync(string sourceContainer, string sourceDirectory, string targetContainer, string targetDirectory);
///
/// Koperien von Dateien eines Pfades in einen anderen
///
/// Name des Containers
/// Quellpfad
/// ZielPfad
Task CopyFilesAsync(string containerName, string sourceDirectory, string targetDirectory);
///
/// Verschieben von Dateien eines Containers in einen anderen
///
/// Quellcontainer
/// Quellpfad
/// ZielContainer
/// ZielPfad
Task MoveFilesAsync(string sourceContainer, string sourceDirectory, string targetContainer, string targetDirectory);
///
/// Verschieben von Dateien eines Pfades in einen anderen
///
/// Name des Containers
/// Quellpfad
/// ZielPfad
Task MoveFilesAsync(string containerName, string sourceDirectory, string targetDirectory);
///
/// Löschen des Inhalts eines Verzeichnises
///
/// Name des Containers
/// Verzeichnis
/// Optional: Dateinamen Wildcard
Task ClearDirectoryAsync(string containerName, string directory, string fileNamePart = "");
///
/// Löscht einen Container und den Inhalt
///
/// Name des Containers
Task DeleteContainerAsync(string containerName);
///
/// Löscht Dateien aus einem Ordner auf welche
/// vor dem Datum das letzte mal zugegriffen wurde
///
/// Name des Containers
/// Verzeichnis
/// Datum
Task DeleteOldFilesAsync(string containerName, string directory, DateTimeOffset date);
///
/// Gibt den reinen Dateinamen eines Files zurück (Ohne Directories usw)
///
/// Dateiname
/// Reiner Dateiname
string GetFlatFilename(string fileName);
}
}