using Azure;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Sas;
using Core.Blueprint.Storage.Adapters;
namespace Core.Blueprint.Storage.Contracts
{
///
/// Defines a contract for managing blobs and containers in Azure Blob Storage.
///
public interface IBlobStorageProvider
{
///
/// Creates the blob container if it does not exist.
///
/// A containing the container information.
Task> CreateIfNotExistsAsync();
///
/// Deletes the blob container if it exists.
///
Task DeleteIfExistsAsync();
///
/// Gets properties of the blob container.
///
/// A containing container properties.
Task> GetPropertiesAsync();
///
/// Sets metadata for the blob container.
///
/// The metadata to set for the container.
Task SetMetadataAsync(IDictionary metadata);
///
/// Uploads a blob to the container.
///
/// The name of the blob.
/// The content to upload.
/// A containing blob content information.
Task> UploadBlobAsync(string blobName, Stream content);
///
/// Downloads a blob from the container.
///
/// The name of the blob.
/// A containing blob download information.
/// Thrown if the blob does not exist.
Task> DownloadBlobAsync(string blobName);
///
/// Deletes a blob from the container.
///
/// The name of the blob.
Task DeleteBlobAsync(string blobName);
///
/// Lists all blobs in the container with an optional prefix.
///
/// The prefix to filter blobs.
/// A collection of .
Task> ListBlobItemAsync(string? prefix = null);
///
/// Retrieves the account information for the associated Blob Service Client.
///
///
/// A that can be used to cancel the operation.
///
///
/// A task that represents the asynchronous operation. The task result contains the
/// object, which provides details about the account, such as the SKU
/// and account kind.
Task GetAccountInfoAsync(CancellationToken cancellation);
///
/// Gets a blob client for a specific blob.
///
/// The name of the blob.
/// A for the blob.
BlobClient GetBlobClient(string blobName);
///
/// Lists blobs hierarchically using a delimiter.
///
/// The prefix to filter blobs.
/// The delimiter to use for hierarchy.
/// A collection of .
Task> ListBlobsByHierarchyAsync(string? prefix = null, string delimiter = "/");
///
/// Generates a SAS token for the container with specified permissions.
///
/// The permissions to assign to the SAS token.
/// The expiration time for the SAS token.
/// A containing the SAS token.
/// Thrown if SAS URI generation is not supported.
Uri GenerateContainerSasUri(BlobContainerSasPermissions permissions, DateTimeOffset expiresOn);
///
/// Acquires a lease on the blob container.
///
/// The optional proposed lease ID.
/// The optional lease duration.
/// A containing lease information.
Task> AcquireLeaseAsync(string? proposedId = null, TimeSpan? duration = null);
///
/// Releases a lease on the blob container.
///
/// The lease ID to release.
Task ReleaseLeaseAsync(string leaseId);
///
/// Sets access policies for the blob container.
///
/// The type of public access to allow.
/// The optional list of signed identifiers for access policy.
Task SetAccessPolicyAsync(PublicAccessType accessType, IEnumerable? identifiers = null);
///
/// Lists blobs in the container with an optional prefix.
///
/// The prefix to filter blobs.
/// A collection of .
Task> ListBlobsAsync(string? prefix = null);
///
/// Uploads a blob to the container.
///
/// The blob to upload.
/// A representing the uploaded blob.
Task UploadBlobAsync(BlobAddDto newBlob);
///
/// Deletes a blob from the container.
///
/// The name of the blob to delete.
/// A representing the deleted blob, or null if the blob was not found.
Task DeleteBlobsAsync(string fileName);
///
/// Downloads a blob's content.
///
/// The name of the blob.
/// A representing the downloaded blob.
/// Thrown if the blob does not exist.
Task DownloadBlobsAsync(string blobName);
///
/// Generates a secure download URI for a specified blob in the storage container.
///
/// The name of the blob for which the download URI is being generated.
///
/// An instance of containing the generated URI, blob name, and status.
///
///
/// The generated URI includes a Shared Access Signature (SAS) token, which allows secure, time-limited access to the blob.
/// The SAS token grants read-only access to the blob for a duration of 5 minutes starting from the current time.
///
/// Thrown if is null or empty.
/// Thrown if there is an issue communicating with the Azure Blob service.
ValueTask GenerateBlobDownloadUri(string blobName);
///
/// Retrieves the hierarchical folder structure.
///
/// The prefix to start the hierarchy retrieval.
/// A list of representing the folder structure.
Task> GetFolderHierarchyAsync(string prefix);
///
/// Lists neighboring folders based on a prefix.
///
/// The prefix to search for neighboring folders.
/// A dictionary grouping folder names by their prefix.
Task>> ListNeighborFoldersAsync(string? prefix);
}
}