import React, { FC } from 'react';

declare enum UploadAdapter {
    INTERNAL = "INTERNAL",
    GOOGLE_DRIVE = "GOOGLE_DRIVE",
    ONE_DRIVE = "ONE_DRIVE",
    LINK = "LINK",
    CAMERA = "CAMERA"
}
type GoogleDriveConfigs = {
    google_api_key: string;
    google_app_id: string;
    google_client_id: string;
};
type OneDriveConfigs = {
    onedrive_client_id: string;
    redirectUri?: string;
};
declare enum UpupProvider {
    AWS = "aws",
    Azure = "azure",
    BackBlaze = "backblaze",
    DigitalOcean = "digitalocean"
}
type MaxFileSizeObject = {
    size: number;
    unit: 'B' | 'KB' | 'MB' | 'GB' | 'TB' | 'PB' | 'EB' | 'ZB' | 'YB';
};
type UpupUploaderPropsClassNames = {
    fileIcon?: string;
    containerMini?: string;
    containerFull?: string;
    containerHeader?: string;
    containerCancelButton?: string;
    containerAddMoreButton?: string;
    adapterButtonList?: string;
    adapterButton?: string;
    adapterButtonIcon?: string;
    adapterButtonText?: string;
    adapterViewHeader?: string;
    adapterViewCancelButton?: string;
    adapterView?: string;
    driveLoading?: string;
    driveHeader?: string;
    driveLogoutButton?: string;
    driveSearchContainer?: string;
    driveSearchInput?: string;
    driveBody?: string;
    driveItemContainerDefault?: string;
    driveItemContainerSelected?: string;
    driveItemContainerInner?: string;
    driveItemInnerText?: string;
    driveFooter?: string;
    driveAddFilesButton?: string;
    driveCancelFilesButton?: string;
    urlInput?: string;
    urlFetchButton?: string;
    cameraPreviewContainer?: string;
    cameraDeleteButton?: string;
    cameraCaptureButton?: string;
    cameraRotateButton?: string;
    cameraAddButton?: string;
    fileListContainer?: string;
    fileListContainerInnerSingle?: string;
    fileListContainerInnerMultiple?: string;
    fileListFooter?: string;
    filePreviewPortal?: string;
    fileItemSingle?: string;
    fileItemMultiple?: string;
    fileThumbnailSingle?: string;
    fileThumbnailMultiple?: string;
    fileInfo?: string;
    fileName?: string;
    fileSize?: string;
    filePreviewButton?: string;
    fileDeleteButton?: string;
    uploadButton?: string;
    uploadDoneButton?: string;
    progressBarContainer?: string;
    progressBar?: string;
    progressBarInner?: string;
    progressBarText?: string;
};
type UpupUploaderPropsIcons = {
    ContainerAddMoreIcon?: FC<{
        className?: string;
    }>;
    FileDeleteIcon?: FC<{
        className?: string;
    }>;
    CameraDeleteIcon?: FC<{
        className?: string;
    }>;
    CameraCaptureIcon?: FC<{
        className?: string;
    }>;
    CameraRotateIcon?: FC<{
        className?: string;
    }>;
    LoaderIcon?: FC<{
        className?: string;
    }>;
};
type UpupUploaderProps = {
    provider: UpupProvider;
    tokenEndpoint: string;
    enableAutoCorsConfig?: boolean;
    uploadAdapters?: UploadAdapter[];
    driveConfigs?: {
        googleDrive?: GoogleDriveConfigs;
        oneDrive?: OneDriveConfigs;
    };
    shouldCompress?: boolean;
    accept?: string;
    limit?: number;
    allowPreview?: boolean;
    isProcessing?: boolean;
    mini?: boolean;
    maxFileSize?: MaxFileSizeObject;
    customProps?: object;
    dark?: boolean;
    classNames?: UpupUploaderPropsClassNames;
    icons?: UpupUploaderPropsIcons;
    onFilesSelected?: (files: FileWithParams[]) => void;
    onDoneClicked?: () => void;
    onPrepareFiles?: (files: FileWithParams[]) => Promise<FileWithParams[]>;
    onFileClick?: (file: FileWithParams) => void;
    onIntegrationClick?: (integrationType: string) => void;
    onFileUploadStart?: (file: FileWithParams) => void;
    onFileUploadComplete?: (file: FileWithParams, key: string) => void;
    onFilesUploadComplete?: (fileWithParams: FileWithParams[]) => void;
    onFileUploadProgress?: (file: FileWithParams, { loaded, total, percentage, }: {
        loaded: number;
        total: number;
        percentage: number;
    }) => void;
    onFilesUploadProgress?: (completedFiles: number, totalFiles: number) => void;
    onFileRemove?: (file: FileWithParams) => void;
    onFilesDragOver?: (files: File[]) => void;
    onFilesDragLeave?: (files: File[]) => void;
    onFilesDrop?: (files: File[]) => void;
    onFileTypeMismatch?: (file: File, acceptedTypes: string) => void;
    onError?: (errorMessage: string) => void;
    onWarn?: (warningMessage: string) => void;
};
type FileWithParams = File & {
    id: string;
    url: string;
    key?: string;
    fileHash?: string | undefined;
    thumbnail?: {
        file: File;
        key?: string;
    };
};
type FileWithProgress = FileWithParams & {
    progress: number;
};

type UpupUploaderRef = {
    useUpload(): {
        error?: string;
        files: FileWithParams[];
        loading: boolean;
        progress: number;
        upload(): Promise<FileWithParams[] | undefined>;
        resetState(): void;
        dynamicUpload(files: File[] | FileWithParams[]): Promise<FileWithParams[] | undefined>;
        setFiles(newFiles: File[]): void;
        dynamicallyReplaceFiles(files: File[] | FileWithParams[]): void;
    };
};
declare const _default: React.ForwardRefExoticComponent<UpupUploaderProps & React.RefAttributes<UpupUploaderRef>>;

export { type FileWithParams, type FileWithProgress, type GoogleDriveConfigs, type OneDriveConfigs, UploadAdapter, UpupProvider, _default as UpupUploader, type UpupUploaderRef };
