using System.IO;
using System.Threading.Tasks;

namespace Knot.Contracts.Storage.Abstractions;

public interface IFileStorageService
{
    // Загружает поток файла и возвращает его уникальный идентификатор (SHA256 хеш или GUID).
    Task<string> UploadFileAsync(Stream stream, string fileName, string contentType);

    // Скачивает файл и возвращает его расшифрованный поток и тип содержимого.
    Task<(Stream Stream, string ContentType, string FileName)> DownloadFileAsync(string fileId);

    // Удаляет файл из хранилища.
    Task DeleteFileAsync(string fileId);

    // Получает список всех файлов в хранилище с их размерами.
    Task<IEnumerable<(string FileId, long Size)>> ListFilesAsync();

    // Получает размер конкретного файла
    Task<long> GetFileSizeAsync(string fileId, CancellationToken ct = default);

    // Получает размеры списка файлов
    Task<Dictionary<string, long>> GetFileSizesAsync(IEnumerable<string> fileIds, CancellationToken ct = default);
}
