import * as _azure_storage_blob from '@azure/storage-blob';
import { StoragePipelineOptions, BlobServiceClient, AccountSASResourceTypes, AccountSASPermissionsLike, ServiceGenerateAccountSasUrlOptions, ContainerSASPermissionsLike, ContainerGenerateSasUrlOptions, BlobSASPermissionsLike, BlobGenerateSasUrlOptions, BlobItem } from '@azure/storage-blob';
import { Scope, ModuleMetadata, Type, DynamicModule } from '@nestjs/common';

declare const STORAGE_BLOB_CLIENT = "STORAGE_BLOB_CLIENT";
declare const STORAGE_BLOB_OPTIONS = "STORAGE_BLOB_OPTIONS";
declare const CONNECTION_VARIABLE = "NEST_STORAGE_BLOB_CONNECTION";

declare function InjectStorageBlob(): (target: object, key: string | symbol | undefined, index?: number | undefined) => void;

type PartialModuleOptions = {
    storageOptions?: StoragePipelineOptions;
    scope?: Scope;
    connection: string;
};
type ModuleOptions = PartialModuleOptions & {
    isGlobal?: boolean;
};
type InstantiateOptions = Pick<ModuleOptions, 'connection' | 'storageOptions'>;
type OptionsFactory = {
    createOptions(): Promise<PartialModuleOptions> | PartialModuleOptions;
};
type ModuleAsyncOptions = Pick<ModuleMetadata, 'imports'> & {
    isGlobal?: boolean;
    useExisting?: Type<OptionsFactory>;
    useClass?: Type<OptionsFactory>;
    useFactory?: (...args: any[]) => Promise<PartialModuleOptions> | PartialModuleOptions;
    inject?: any[];
    scope?: Scope;
};
type GetAccountSasUrlResponse = {
    sasUrl: string;
    headers: Record<string, string | number>;
};
type GetContainerSasUrlResponse = {
    sasUrl: string;
    headers: Record<string, string | number>;
};
type GetBlockBlobSasUrlResponse = {
    sasUrl: string;
    headers: Record<string, string | number>;
};

declare class StorageBlobModule {
    static forRoot(options: ModuleOptions): DynamicModule;
    static forRootAsync(options: ModuleAsyncOptions): DynamicModule;
    private static createAsyncProviders;
    private static createAsyncOptionsProvider;
    private static instantiate;
}

declare class StorageBlobService {
    private readonly blobServiceClient;
    private containerName?;
    constructor(blobServiceClient: BlobServiceClient);
    getClient(): BlobServiceClient;
    getContainerName(): string | undefined;
    convertToResourceTypes(resourceTypeMap?: Omit<AccountSASResourceTypes, 'toString'>): string;
    getAccountSasUrl(expiresOn?: Date, permissions?: AccountSASPermissionsLike, resourceTypeMap?: Omit<AccountSASResourceTypes, 'toString'>, options?: ServiceGenerateAccountSasUrlOptions): GetAccountSasUrlResponse;
    getContainerSasUrl(containerName: string, permissions?: ContainerSASPermissionsLike, options?: Omit<ContainerGenerateSasUrlOptions, 'permissions'>): Promise<GetContainerSasUrlResponse>;
    getBlockBlobSasUrl(containerName: string, blobName: string, permissions?: BlobSASPermissionsLike, options?: Omit<BlobGenerateSasUrlOptions, 'permissions'>): Promise<GetBlockBlobSasUrlResponse>;
    getUploadable(containerName: string, blobName: string, expiresIn?: number): Promise<{
        upload: {
            method: string;
            url: string;
            headers: Record<string, string | number>;
            expiresIn: number;
        };
        download: {
            method: string;
            url: string;
            expiresIn: number;
        };
    }>;
    listFiles(destination: string, containerName: string): Promise<BlobItem[]>;
    deleteFile(container: string, blob: string): Promise<_azure_storage_blob.BlobDeleteResponse>;
    deleteFileIfExists(container: string, blob: string): Promise<_azure_storage_blob.BlobDeleteIfExistsResponse>;
    downloadStream(container: string, blob: string): Promise<_azure_storage_blob.BlobDownloadResponseParsed>;
}

export { CONNECTION_VARIABLE, GetAccountSasUrlResponse, GetBlockBlobSasUrlResponse, GetContainerSasUrlResponse, InjectStorageBlob, InstantiateOptions, ModuleAsyncOptions, ModuleOptions, OptionsFactory, PartialModuleOptions, STORAGE_BLOB_CLIENT, STORAGE_BLOB_OPTIONS, StorageBlobModule, StorageBlobService };
