import React from 'react';
import AssetFileUpload from 'src/components/fileUpload/assetFileUpload';
import MetadataFileUpload from 'src/components/fileUpload/metadataFileUpload';
import { BULK_CREATION_STEPS, METADATA_UPLOADING_STATUS } from 'src/constants';
import type { FileRejection } from 'react-dropzone';
import type { ASSET_UPLOADING_STATUS } from 'src/constants';
import './index.scss';

const FileUpload = ({
    bulkSessionId,
    onUploadFile,
    metadataUploadingStatus,
    assetUploadingStatus,
    assetUploadingPercentage,
    activeStep,
    isRetry,
    setMetadataUploadingStatus,
    setAssetUploadingStatus,
    saveUnidentifiedAssets,
    setHasFileFormatErrors,
    setErrorFileExtension,
    isVendorUuidLoading = false,
}: {
    bulkSessionId: string;
    onUploadFile: (acceptedFiles: File[]) => void;
    metadataUploadingStatus: METADATA_UPLOADING_STATUS;
    assetUploadingStatus: ASSET_UPLOADING_STATUS;
    assetUploadingPercentage: number;
    activeStep: BULK_CREATION_STEPS;
    isRetry: boolean;
    setMetadataUploadingStatus: (status: METADATA_UPLOADING_STATUS) => void;
    setAssetUploadingStatus: (status: ASSET_UPLOADING_STATUS) => void;
    saveUnidentifiedAssets: (unidentifiedAssets: string[]) => void;
    setHasFileFormatErrors: (errors: boolean) => void;
    setErrorFileExtension: (extension: string | null) => void;
    isVendorUuidLoading?: boolean;
}) => {
    const typeOfUpload =
        activeStep === BULK_CREATION_STEPS.METADATA_UPLOAD ||
        activeStep === BULK_CREATION_STEPS.METADATA_INVALID
            ? 'metadata'
            : 'assets';

    const handleFileRejection = (rejectedFiles: FileRejection[]) => {
        const fileName = rejectedFiles[0].file.name;
        const fileExtension = fileName.split('.').pop();
        setHasFileFormatErrors(true);
        setErrorFileExtension(fileExtension ?? null);
        if (typeOfUpload == 'metadata')
            setMetadataUploadingStatus(METADATA_UPLOADING_STATUS.READY);
    };

    if (typeOfUpload === 'metadata')
        return (
            <MetadataFileUpload
                onUploadFile={onUploadFile}
                metadataUploadingStatus={metadataUploadingStatus}
                handleFileRejection={handleFileRejection}
                isVendorUuidLoading={isVendorUuidLoading}
            />
        );
    else
        return (
            <AssetFileUpload
                onUploadFile={onUploadFile}
                assetUploadingStatus={assetUploadingStatus}
                assetUploadingPercentage={assetUploadingPercentage}
                isRetry={isRetry}
                handleFileRejection={handleFileRejection}
                bulkSessionId={bulkSessionId}
                setAssetUploadingStatus={setAssetUploadingStatus}
                saveUnidentifiedAssets={saveUnidentifiedAssets}
            />
        );
};

export default FileUpload;
