import { useEffect, useRef, useState, useContext, useCallback } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import { decode } from 'js-base64';
import classNames from 'classnames';
import { getIconByExtension, syncStorageUsage } from '../../utils/common';
import { ThemeContext } from '../Provider/Context';
import { HiOutlineFolderAdd } from 'react-icons/hi';
import { AiOutlineFileAdd } from 'react-icons/ai';

const CloudUploadIcon = ({ width = 55, height = 55, className = '' }) => (
	<svg
		xmlns="http://www.w3.org/2000/svg"
		width={width}
		height={height}
		viewBox="0 0 55 55"
		fill="none"
		className={className}
	>
		<path
			d="M26.692 25.303C27.3767 25.0726 28.0618 25.0726 28.5182 25.303C28.7464 25.3031 28.9746 25.5336 29.2028 25.7639L38.3317 34.9797C39.2443 35.9012 39.2442 37.2838 38.3317 38.2053C37.8753 38.666 37.1904 38.8966 36.734 38.8967C36.2776 38.8967 35.5928 38.6661 35.1364 38.2053L29.8873 32.9065V48.1126C29.8873 49.4949 28.9744 50.4163 27.6051 50.4163C26.2359 50.4162 25.3229 49.4949 25.3229 48.1126V32.9065L20.0739 38.2053C19.161 39.1268 17.7923 39.1268 16.8795 38.2053C15.9667 37.2837 15.9667 35.9013 16.8795 34.9797L26.0074 25.7639C26.2356 25.5336 26.4638 25.5333 26.692 25.303ZM15.5104 5.25807C25.7797 2.49368 36.5051 8.48416 39.9283 18.3909H41.2985C46.3189 18.391 50.8829 21.1561 53.3932 25.5335C54.9907 28.5286 55.4476 32.4456 54.5348 35.9016C53.3938 39.3574 51.1114 42.3524 47.9166 44.1956C47.4602 44.426 47.2314 44.426 46.775 44.426C45.8624 44.426 45.1777 43.9656 44.7213 43.2747C44.0367 42.1227 44.4933 40.7403 45.6344 40.0491C47.6883 38.8971 49.2857 36.8228 49.9703 34.5188C50.6549 32.2149 50.4268 29.6802 49.2858 27.6067C47.6883 24.6118 44.7214 22.769 41.2985 22.7688H38.3317C37.1906 22.7688 36.2776 22.0771 36.0494 21.1555C33.7672 12.631 25.0948 7.33207 16.651 9.636C12.5432 10.5576 9.11996 13.0922 7.06604 16.7786C4.78397 20.6953 4.09883 24.8425 5.23987 29.22C5.92451 31.7544 7.0662 34.0584 8.6637 35.9016C9.57636 36.8232 9.34798 38.2057 8.43518 39.1272C7.52233 40.0486 6.15268 39.8183 5.23987 38.8967C3.18611 36.3625 1.58924 33.5976 0.67639 30.3723C-0.692889 25.0732 -0.00815572 19.5427 2.95862 14.7044C5.92538 9.86629 10.2617 6.64041 15.5104 5.25807Z"
			fill="url(#paint0_linear)"
		/>
		<mask
			id="mask0_1_2132"
			style={{ maskType: 'luminance' }}
			maskUnits="userSpaceOnUse"
			x="0"
			y="4"
			width="55"
			height="47"
		>
			<path
				d="M26.692 25.303C27.3767 25.0726 28.0618 25.0726 28.5182 25.303C28.7464 25.3031 28.9746 25.5336 29.2028 25.7639L38.3317 34.9797C39.2443 35.9012 39.2442 37.2838 38.3317 38.2053C37.8753 38.666 37.1904 38.8966 36.734 38.8967C36.2776 38.8967 35.5928 38.6661 35.1364 38.2053L29.8873 32.9065V48.1126C29.8873 49.4949 28.9744 50.4163 27.6051 50.4163C26.2359 50.4162 25.3229 49.4949 25.3229 48.1126V32.9065L20.0739 38.2053C19.161 39.1268 17.7923 39.1268 16.8795 38.2053C15.9667 37.2837 15.9667 35.9013 16.8795 34.9797L26.0074 25.7639C26.2356 25.5336 26.4638 25.5333 26.692 25.303ZM15.5104 5.25807C25.7797 2.49368 36.5051 8.48416 39.9283 18.3909H41.2985C46.3189 18.391 50.8829 21.1561 53.3932 25.5335C54.9907 28.5286 55.4476 32.4456 54.5348 35.9016C53.3938 39.3574 51.1114 42.3524 47.9166 44.1956C47.4602 44.426 47.2314 44.426 46.775 44.426C45.8624 44.426 45.1777 43.9656 44.7213 43.2747C44.0367 42.1227 44.4933 40.7403 45.6344 40.0491C47.6883 38.8971 49.2857 36.8228 49.9703 34.5188C50.6549 32.2149 50.4268 29.6802 49.2858 27.6067C47.6883 24.6118 44.7214 22.769 41.2985 22.7688H38.3317C37.1906 22.7688 36.2776 22.0771 36.0494 21.1555C33.7672 12.631 25.0948 7.33207 16.651 9.636C12.5432 10.5576 9.11996 13.0922 7.06604 16.7786C4.78397 20.6953 4.09883 24.8425 5.23987 29.22C5.92451 31.7544 7.0662 34.0584 8.6637 35.9016C9.57636 36.8232 9.34798 38.2057 8.43518 39.1272C7.52233 40.0486 6.15268 39.8183 5.23987 38.8967C3.18611 36.3625 1.58924 33.5976 0.67639 30.3723C-0.692889 25.0732 -0.00815572 19.5427 2.95862 14.7044C5.92538 9.86629 10.2617 6.64041 15.5104 5.25807Z"
				fill="white"
			/>
		</mask>
		<g mask="url(#mask0_1_2132)" />
		<defs>
			<linearGradient
				id="paint0_linear"
				x1="0"
				y1="4.58301"
				x2="109.793"
				y2="24.1475"
				gradientUnits="userSpaceOnUse"
			>
				<stop stopColor="#5820E5" />
				<stop offset={1} stopColor="#F30D55" />
			</linearGradient>
		</defs>
	</svg>
);

const Uploader = (props) => {
	const {
		path = '',
		className,
		showHideBtn = true,
		filters = {
			allowAllExtension: true,
			allowedExtensions,
			allowedExceptExtensions,
			showFiles: true,
			showFolders: true,
		},
		formLabel = __('Uploader', 'easy-dropbox-integration'),
		formDesc = `<p>${__( 'Drag and drop files or folders', 'easy-dropbox-integration' )}</p><p>${__('or', 'easy-dropbox-integration')}</p>`,
		enableUploadBtn = true,
		uploaderButtonText = __('Upload', 'easy-dropbox-integration'),
		allowFolderUpload = true,
		isFormUploader = '',
		isRequired = false,
		maxFiles = '',
		minFileSize = '',
		maxFileSize = '',
		isWooCommerceUploader = false,
		overwrite = false,
		shortCodeID = '',
		showUploadConfirmation = false,
		uploadConfirmMsg = `<h3>${__('Uploaded Successfully!', 'easy-dropbox-integration')}</h3><p>${__('File(s) uploaded successfully!', 'easy-dropbox-integration')}</p>`,
		fileUploadButtonLabel = __('Select Files', 'easy-dropbox-integration'),
		folderUploadButtonLabel = __('Select Folder', 'easy-dropbox-integration'),
		uploadFileName = '',
		uploadImmediately = true,
		onUpload = () => {},
		isMainUploader = false,
		accountId = '',
	} = props;

	const { setShowUploader, setRefresh, setIsLoading, refresh, currentPath  } = useContext(ThemeContext);

	let { activeAccount } = EDBIData;
	activeAccount = JSON.parse(decode(activeAccount));

	let accIdToUpload = '' !== accountId ? accountId : activeAccount['id'];

	const cPath = path ? path : currentPath;

	// Simple state - like the reference
	const filesRef = useRef([]);
	const [uploadedFiles, setUploadedFiles] = useState([]);
	const [inProgress, setInProgress] = useState([]);
	const [queue, setQueue] = useState([]);
	const [percentage, setPercentage] = useState(0);
	const [isComplete, setIsComplete] = useState(false);
	const [pausedItems, setPausedItems] = useState([]);
	const [allFilesUploaded, setAllFilesUploaded] = useState(false);
	const [pendingPostUploads, setPendingPostUploads] = useState(0);

	// Refs
	const uploaderRef = useRef(null);
	const uploaderElementRef = useRef(null);
	const submitBtnRef = useRef(null);
	const submitBtnTextRef = useRef(null);
	const dragCounterRef = useRef(0);

	// Handle isComplete state change for browser mode (close uploader, refresh)
	useEffect(() => {
		if (isComplete && !isFormUploader && !showUploadConfirmation) {
			setShowUploader(false);
			setRefresh((prev) => !prev);
			setIsLoading(true);
		}
	}, [isComplete, isFormUploader, showUploadConfirmation]);

	useEffect(() => {
		if (isComplete && pendingPostUploads === 0) {
			syncStorageUsage();
		}
	}, [isComplete, pendingPostUploads]);

	// Get relative path
	const getRelativePath = (file) => {
		if (!file?.getSource) return '';
		return file?.getSource?.()?.relativePath?.replace(/^\//, '') || '';
	};

	// Convert bytes to MB
	const bytesToMB = (bytes) => {
		return ((bytes || 0) / (1024 * 1024)).toFixed(2);
	};

	// Upload next file
	const mayUploadNext = (file) => {
		if (!file) return;

		const files = filesRef.current;
		const currentFileIndex = files.findIndex(item => item.id === file.id);
		const nextFileIndex = currentFileIndex + 1;

		if (nextFileIndex < files.length) {
			processUpload(files[nextFileIndex]);
		}
	};

	// Add custom file filters
	const pluploadAddFilters = () => {
		plupload.buildUrl = url => url;
		plupload.addFileFilter('file_ext', handleFileExtension);
		plupload.addFileFilter('min_file_size', handleFileSize);
		plupload.addFileFilter('max_files', handleMaxFiles);
	};

	const handleFileExtension = (extensions, file, cb) => {
		if (!extensions) return cb(true);

		const ext = file.name.split('.').pop().toLowerCase();
		const shouldUpload = filters.allowAllExtension
			? !extensions.split(',').map(item => item.trim().toLowerCase()).includes(ext)
			: extensions.split(',').map(item => item.trim().toLowerCase()).includes(ext);

		if (!shouldUpload) {
			uploaderRef.current.trigger('Error', { code: 'EXT_ERROR', file });
			cb(false);
		} else {
			cb(true);
		}
	};

	const handleFileSize = (minSize, file, cb) => {
		minSize = minSize * 1024 * 1024;
		if (!minSize) return cb(true);
		if (file.size < minSize) {
			uploaderRef.current.trigger('Error', { code: 'SIZE_MIN_ERROR', file });
			cb(false);
		} else {
			cb(true);
		}
	};

	const handleMaxFiles = (maxFiles, file, cb) => {
		if (!maxFiles) return cb(true);

		let uploadedFilesLength = uploaderRef.current.files.length;

		if (uploadedFiles.length) {
			uploadedFilesLength = uploaderElementRef.current.querySelectorAll('.edbi-file-upload-list__item.edbi-file-upload-list__item--uploaded').length;
		}

		if (uploadedFilesLength >= maxFiles) {
			uploaderRef.current.trigger('Error', { code: 'MAX_FILE_ERROR', file });
			cb(false);
		} else {
			cb(true);
		}
	};

	// Handle errors
	const handleError = (code, file) => {
		let msg;

		switch (code) {
			case -600:
				msg = __('File size exceeds the maximum upload size.', 'easy-dropbox-integration') +
					`(${maxFileSize ? `${parseInt(maxFileSize)}MB` : 0})`;
				break;
			case 'SIZE_MIN_ERROR':
				msg = __('File size is less than the minimum upload size.', 'easy-dropbox-integration') +
					`(${minFileSize}MB)`;
				break;
			case 'EXT_ERROR':
				msg = __('This file type is not allowed', 'easy-dropbox-integration');
				break;
			case 'MAX_FILE_ERROR':
				msg = __('You can not upload more than', 'easy-dropbox-integration') +
					` ${maxFiles} ${__('files', 'easy-dropbox-integration')}`;
				break;
			default:
				// file.error could be an object, extract message
				msg = typeof file.error === 'object' ? file.error?.message || file.error?.error || String(file.error) : file.error;
				break;
		}

		file.error = msg;

		// Update filesRef
		if (filesRef.current.find(item => item.id === file.id)) {
			const fileIndex = filesRef.current.findIndex(item => item.id === file.id);
			filesRef.current[fileIndex] = file;
		} else {
			filesRef.current = [...filesRef.current, file];
		}

		setInProgress([...inProgress]);
	};

	// Handle file uploaded
	const handleFileUploaded = (file, result) => {
		// Remove from inProgress
		setInProgress(prev => prev.filter(item => item.id !== file.id));

		let uploadedFile = JSON.parse(result.response);

		if (!uploadedFile) return;

		// WordPress AJAX wraps response as { success: true, data: {...} }
		// So we need to get uploadedFile.data.file or uploadedFile.file
		const fileData = uploadedFile.data?.file || uploadedFile.file;

		uploadedFile = {
			id: fileData.id || uploadedFile.id,
			name: fileData.name,
			size: fileData.size,
			type: fileData.type,
			link: fileData.link,
			account_id: accIdToUpload,
			pluploadId: file.id,
			path: allowFolderUpload && getRelativePath(file),
		};


		let postData = {
			file: uploadedFile,
			account_id: accIdToUpload,
		};

		if (isWooCommerceUploader) {
			postData.wcItemId = '';
			postData.wcProductId = '';
		}

		// Remove from queue
		setQueue(prev => prev.filter(item => item.id !== file.id));

		// Increment pending post-uploads counter
		setPendingPostUploads(prev => prev + 1);

		// Post process uploaded file
		wp.ajax.post('edbi_post_upload', {
			shortcode_id: shortCodeID,
			...postData,
			nonce: EDBIData.ajaxNonce,
		}).done((response) => {
			// Add to uploadedFiles AFTER post-upload is complete
			setUploadedFiles(prev => [...prev, uploadedFile]);

			// Decrement pending post-uploads counter
			setPendingPostUploads(prev => {
				const newCount = prev - 1;
				return newCount;
			});

			if (onUpload) {
				onUpload(uploadedFile, response);
			}
		}).fail((error) => {
			// Decrement on error too
			setPendingPostUploads(prev => prev - 1);
			console.error('Post-upload failed:', error);
		});

		// Check for next file
		mayUploadNext(file);
	};

	// Process upload
	const processUpload = (file) => {
		if (!file) return;

		uploaderRef.current.stop();
		setPercentage(0);

		setInProgress(prev => {
			return prev.find(item => item.id === file.id) ? prev : [...prev, file];
		});

		const filePath = getRelativePath(file);

		wp.ajax.post('edbi_pre_upload', {
			file: {
				name: file.name,
				size: file.size,
				type: file.type,
			},
			path: cPath,
			folder: filePath && filePath.substring(0, filePath.lastIndexOf('/') + 1),
			account_id: accIdToUpload,
			shortcode_id: shortCodeID,
			nonce: EDBIData.ajaxNonce,
		}).done((response) => {
			uploaderRef.current.setOption('url', response.uploadUrl);
			uploaderRef.current.setOption('multipart_params', {
				nonce: EDBIData.ajaxNonce,
				path: response.path,
				account_id: response.account_id,
			});
			uploaderRef.current.start();
		}).fail((error) => {
			console.log(error);

			mayUploadNext(file);

			setQueue(queue.filter(item => item.id !== file.id));
			setInProgress(queue.filter(item => item.id !== file.id));
			setPercentage(0);

			// Set error to filesRef - error could be an object
			const errorMsg = typeof error === 'object' ? error?.error || error?.message || String(error) : error;
			filesRef.current = filesRef.current.map(item => {
				if (item.id === file.id) {
					item.error = errorMsg;
				}
				return item;
			});

			if (isFormUploader) {
				if (queue.length === 1) {
					if (submitBtnRef.current?.length) {
						if (submitBtnRef.current.is('input')) {
							submitBtnRef.current.val(submitBtnTextRef.current);
						} else {
							submitBtnRef.current.text(submitBtnTextRef.current);
						}
					}
				}
			}
		});
	};

	// Get uploader options
	const getUploaderOptions = () => {
		const options = {
			browse_button: uploaderElementRef.current.querySelector('.edbi-browse-files'),
			drop_element: uploaderElementRef.current,
			multipart: true,
			multi_selection: !maxFiles || maxFiles > 1,
			filters: {
				max_files: maxFiles,
				file_ext: filters.allowAllExtension ? filters.allowedExceptExtensions : filters.allowedExtensions,
				max_file_size: maxFileSize ? `${parseInt(maxFileSize)}mb` : 0,
				min_file_size: minFileSize,
			},
			init: {
				FilesAdded: (uploader, files) => {
					setIsComplete(false);

					setQueue(prev => [...prev, ...files]);

					// Update filesRef
					filesRef.current = [...filesRef.current, ...files];

					setInProgress(prev => {
						let newInProgress = [...prev];

						if (uploadImmediately && !prev.length) {
							processUpload(files[0]);
							newInProgress = [...prev, files[0]];
						}

						return newInProgress;
					});
				},

				FilesRemoved: (uploader, removed) => {
					setQueue(prev => prev.filter(item => !removed.find(removedItem => removedItem.id === item.id)));
					filesRef.current = filesRef.current.filter(item => !removed.find(removedItem => removedItem.id === item.id));
				},

				FileUploaded: (uploader, file, result) => {
					handleFileUploaded(file, result);
				},

				UploadProgress: (uploader, file) => {
					setPercentage(file.percent);
				},

				UploadComplete: () => {
					setInProgress([]);
					setQueue([]);

					// Mark all files as uploaded - this will trigger form update
					setAllFilesUploaded(true);
					setIsComplete(true);
				},

				Error: (uploader, error) => handleError(error.code, error.file),
			},
		};

		if (!filters.allowAllExtension && filters.allowedExtensions) {
			options.filters.mime_types = [
				{
					title: __('Allowed Files', 'easy-dropbox-integration'),
					extensions: filters.allowedExtensions.split(',').map(ext => ext.trim()).join(',')
				}
			];
		}

		return options;
	};

	// Init plupload
	const pluploadInit = () => {
		pluploadAddFilters();

		uploaderRef.current = new plupload.Uploader(getUploaderOptions());
		uploaderRef.current.init();

		if (filters?.showFolders && allowFolderUpload) {
			const folderUpload = new mOxie.FileInput({
				browse_button: uploaderElementRef.current.querySelector('.edbi-browse-folder'),
				directory: true
			});

			folderUpload.init();
			folderUpload.onchange = () => {
				uploaderRef.current.addFile(folderUpload.files);
			};
		}
	};

	// Handle Form Files
	const mapFiles = (files) => {
		return files.map(item => ({
			id: item.id,
			account_id: item.account_id,
			name: item.name,
			size: item.size,
			link: item.link,
			path: allowFolderUpload && item.path,
		}));
	};

	const updateFormFiles = () => {
		// ALWAYS search for the element in DOM - don't rely on ref
		const uploaderEl = document.querySelector('.edbi-file-browser__upload');

		if (!uploaderEl) {
			console.error('updateFormFiles: Could not find .edbi-uploader-container element in DOM');
			return;
		}

		// Find the parent wrapper (like wpcf7-form-control-wrap) that contains both uploader and hidden input
		const parentWrapper = uploaderEl.parentElement;
		const form = uploaderEl.closest('form');
		if (!form) {
			console.error('updateFormFiles: Could not find form element');
			return;
		}

		// Search for .edbi-uploaded-file-list in multiple locations:
		// 1. Within the parent wrapper (CF7 style - inside same wrapper)
		// 2. As a next element sibling (some integrations)
		// 3. Within the form (fallback)
		let uploadList = parentWrapper?.querySelector('.edbi-uploaded-file-list');
		if (!uploadList) {
			// Check if parent wrapper itself has the class
			if (parentWrapper?.classList?.contains('edbi-uploaded-file-list')) {
				uploadList = parentWrapper;
			}
		}
		if (!uploadList && parentWrapper) {
			// Try next element sibling
			const nextSibling = parentWrapper.nextElementSibling;
			if (nextSibling?.classList?.contains('edbi-uploaded-file-list')) {
				uploadList = nextSibling;
			}
		}
		if (!uploadList) {
			uploadList = form.querySelector('.edbi-uploaded-file-list');
		}

		const files = mapFiles(uploadedFiles);

		// If no hidden input exists, create one dynamically
		if (!uploadList) {
			uploadList = document.createElement('input');
			uploadList.type = 'hidden';
			uploadList.className = 'edbi-uploaded-file-list edbi-hidden';
			uploadList.name = uploadFileName || 'edbi_uploaded_files';
			// Insert after the uploader's parent wrapper
			if (parentWrapper) {
				parentWrapper.parentNode.insertBefore(uploadList, parentWrapper.nextSibling);
			} else {
				form.appendChild(uploadList);
			}
		}

		if (['fluentforms', 'formidableforms', 'gravityforms'].includes(isFormUploader)) {
			uploadList.value = JSON.stringify(files);
		} else {
			const formattedValue = files.map(file => {
				return `${file.name} - (${bytesToMB(file.size)} MB - ${file.path || ''} - ${file.link || ''})`;
			}).join(", \n\n");

			uploadList.value = formattedValue;
		}

		// Trigger events
		uploadList.dispatchEvent(new Event('input', { bubbles: true }));
		uploadList.dispatchEvent(new Event('change', { bubbles: true }));
		form.dispatchEvent(new Event('input', { bubbles: true }));
		form.dispatchEvent(new Event('change', { bubbles: true }));

		// Restore button text and submit
		const submitBtn = form.querySelector('[type=submit]');
		if (submitBtn) {
			if (submitBtnTextRef.current) {
				if (submitBtn.tagName === 'INPUT') {
					submitBtn.value = submitBtnTextRef.current;
				} else {
					submitBtn.textContent = submitBtnTextRef.current;
				}
			}
			submitBtn.classList.remove('edbi-disabled');
			submitBtn.click();
		} else {
			form.submit();
		}
	};

	// Init plupload
	useEffect(() => {
		const timer = setTimeout(() => {
			if (!uploaderElementRef.current) {
				console.warn('Uploader element ref not set, retrying...');
				// Fallback to querySelector if ref is not set
				uploaderElementRef.current = document.querySelector('.edbi-uploader-container');
			}

			if (!uploaderElementRef.current) {
				console.error('Could not find uploader element');
				return;
			}

			pluploadInit();
		}, 100);

		return () => {
			clearTimeout(timer);
			if (uploaderRef.current) {
				uploaderRef.current.destroy();
			}
		};
	}, []);

	// Handle complete - update form files and submit for form modules
	useEffect(() => {
		// Only proceed when:
		// 1. All files are uploaded (UploadComplete fired)
		// 2. Queue is empty (no more files to process)
		// 3. No files in progress
		// 4. ALL post-upload AJAX calls are complete (pendingPostUploads === 0)
		if (!allFilesUploaded || queue.length > 0 || inProgress.length > 0 || pendingPostUploads > 0) {
			return;
		}

		if (!uploadedFiles.length) return;

		if (isFormUploader) {
			// Wait a bit to ensure DOM is ready before syncing files into the form
			setTimeout(() => {
				updateFormFiles();
			}, 300);
		}
	}, [allFilesUploaded, uploadedFiles, queue, inProgress, pendingPostUploads]);

	// Upload Processor for manual upload (when uploadImmediately is false)
	useEffect(() => {
		// Only for form uploaders with manual upload (not uploadImmediately)
		if (!isFormUploader || uploadImmediately) return;

		if (!queue.length || inProgress.length) return;

		if (!uploaderElementRef.current) return;

		const form = jQuery(uploaderElementRef.current).closest('form');

		if (!form.length) {
			return;
		}

		submitBtnRef.current = jQuery(form).find(':submit');

		if (!submitBtnRef.current.length) return;

		const submitBtnParent = submitBtnRef.current.parent();
		submitBtnRef.current.addClass('edbi-disabled');

		const handleSubmitClick = function (e) {
			e.preventDefault();

			const isInput = submitBtnRef.current.is('input');

			submitBtnTextRef.current = isInput ? submitBtnRef.current.val() : submitBtnRef.current.text();

			if (isInput) {
				submitBtnRef.current.val(__('Uploading Files...', 'easy-dropbox-integration'));
			} else {
				submitBtnRef.current.text(__('Uploading Files...', 'easy-dropbox-integration'));
			}

			processUpload(queue[0]);
		};

		submitBtnParent.on('click', handleSubmitClick);

		return () => {
			if (submitBtnRef.current) {
				submitBtnParent.off('click', handleSubmitClick);
				submitBtnRef.current.removeClass('edbi-disabled');
			}
		};
	}, [queue, isFormUploader, uploadImmediately]);

	// For uploadImmediately mode, capture the submit button reference and text
	useEffect(() => {
		// Only for form uploaders with immediate upload
		if (!isFormUploader || !uploadImmediately) return;

		if (!uploaderElementRef.current) return;

		const form = jQuery(uploaderElementRef.current).closest('form');

		if (!form.length) {
			return;
		}

		submitBtnRef.current = jQuery(form).find(':submit');

		if (!submitBtnRef.current.length) return;

		const isInput = submitBtnRef.current.is('input');
		submitBtnTextRef.current = isInput ? submitBtnRef.current.val() : submitBtnRef.current.text();
	}, [isFormUploader, uploadImmediately]);

	// Handle Form Reset
	useEffect(() => {
		if (!isFormUploader) return;

		const form = jQuery(uploaderElementRef.current).closest('form');

		const resetForm = function (e) {
			filesRef.current = [];
			setQueue([]);
			setInProgress([]);
			setUploadedFiles([]);
			setAllFilesUploaded(false);
			setIsComplete(false);
			setPendingPostUploads(0);
		};

		form.on('reset', resetForm);

		return () => form.off('reset', resetForm);
	}, [isFormUploader]);

	const RenderUploaderContainer = () => {
		return (
			<div
				className='edbi-uploader__wrapper'
				ref={uploaderElementRef}
				onDragEnter={(e) => {
					e.preventDefault();
					dragCounterRef.current++;
					e.currentTarget.classList.add('drag-active');
				}}
				onDragOver={(e) => {
					e.preventDefault();
				}}
				onDragLeave={(e) => {
					e.preventDefault();
					dragCounterRef.current--;
					if (dragCounterRef.current === 0) {
						e.currentTarget.classList.remove('drag-active');
					}
				}}
				onDrop={(e) => {
					e.preventDefault();
					dragCounterRef.current = 0;
					e.currentTarget.classList.remove('drag-active');
				}}
			>
				<div className='edbi-uploader__header'>
					<h3>{__(formLabel, 'easy-dropbox-integration')}</h3>
					{showHideBtn && (
						<span
							onClick={() => setShowUploader(false)}
							style={{ cursor: 'pointer', float: 'right', marginTop: '-25px' }}
						>
							<i className='dashicons dashicons-no'></i>
						</span>
					)}
				</div>
				<div className='edbi-uploader__body'>
					<CloudUploadIcon width={55} height={55} />
					<div dangerouslySetInnerHTML={{ __html: formDesc.replace(/\n/g, '<br />') }}></div>
				</div>
				<div className='edbi-upload__button__container'>
					{filters?.showFiles && (
						<button
							type='button'
							className='edbi-button edbi-button--primary edbi-browse-files'
							onMouseOver={() => {
								navigator.userAgent.match(/iPhone|iPad|iPod/g) &&
									uploaderRef.current &&
									uploaderRef.current.refresh();
							}}
						>
							<AiOutlineFileAdd size={24} style={{ marginRight: '0px', verticalAlign: 'middle' }} />
							{__(fileUploadButtonLabel, 'easy-dropbox-integration')}
						</button>
					)}
					{filters?.showFolders && allowFolderUpload && (
						<button
							type='button'
							className='edbi-button edbi-button--primary edbi-browse-folder'
							onMouseOver={() => {
								navigator.userAgent.match(/iPhone|iPad|iPod/g) &&
									uploaderRef.current &&
									uploaderRef.current.refresh();
							}}
						>
							<HiOutlineFolderAdd size={24} style={{ marginRight: '0px', verticalAlign: 'middle' }} />
							{__(folderUploadButtonLabel, 'easy-dropbox-integration')}
						</button>
					)}
				</div>

				<div className='edbi-file__lists'>
					{filesRef.current.map((file) => {
						const isInProgress = inProgress.find(item => item.id === file.id);
						const isUploaded = uploadedFiles.find(item => item.id === file.id || item.pluploadId === file.id);
						const isPaused = pausedItems.find(item => item.id === file.id);

						return (
							<div key={file.id} className={`edbi-uploading__container edbi-file__lists__item ${isInProgress ? 'active' : ''} ${isUploaded ? 'edbi-file-upload-list__item--uploaded' : ''}`}>
								<div className='edbi-file__icon'>
									<img
										src={getIconByExtension(
											file.isFolder ? 'folder' : (file.name || '').split('.').pop(),
											'32'
										)}
										alt={file.name}
									/>
								</div>
								<div className='edbi-file__container'>
									<div className='edbi-file__info'>
										<div>
											<h4 className='edbi-file__name'>{file.name}</h4>
											<span className='edbi-file__size'>
												{bytesToMB(file.size)} MB
											</span>
										</div>
										{!file.error && (
											<span className='edbi-file__status' style={{ color: isUploaded ? '#10b981' : '#3b82f6' }}>
												{isUploaded ? 'Completed' : isInProgress ? `${percentage}%` : ''}
											</span>
										)}
									</div>

									{file.error ? (
										<p className='edbi-file__error'>{file.error}</p>
									) : (
										<div className='edbi-uploading__progress-track'>
											<div
												className='edbi-uploading__progress-bar'
												style={{ width: isInProgress ? `${percentage}%` : isUploaded ? '100%' : '0%', backgroundColor: isUploaded ? '#10b981' : '#3b82f6' }}
											></div>
										</div>
									)}
								</div>
								<div className='edbi-file-action'>
									<button
										type='button'
										className='edbi-button edbi-button--danger edbi-button--small'
										onClick={(e) => {
											e.preventDefault();
											e.stopPropagation();

											uploaderRef.current.removeFile(file);

											setQueue(prev => prev.filter(item => item.id !== file.id));
											filesRef.current = filesRef.current.filter(item => item.id !== file.id);

											if (isUploaded) {
												setUploadedFiles(prev => prev.filter(item => item.id !== isUploaded.id));
											} else {
												if (isInProgress) {
													uploaderRef.current.stop();
													setPercentage(0);
													mayUploadNext(file);
												}
												uploaderRef.current.removeFile(file);
												uploaderRef.current.setOption('url', '');
												setInProgress(prev => prev.filter(item => item.id !== file.id));
											}
										}}
									>
										<i className='dashicons dashicons-trash'></i>
									</button>
								</div>
							</div>
						);
					})}
				</div>

				{!uploadImmediately && queue.length > 0 && enableUploadBtn && ! isFormUploader && (
					<div className='edbi-upload-actions'>
						<button
							type='button'
							className='edbi-button edbi-button--primary'
							onClick={() => {
								processUpload(queue[0]);
							}}
						>
							{inProgress.length ? __('Uploading Files...', 'easy-dropbox-integration') : __(uploaderButtonText, 'easy-dropbox-integration')}
						</button>
					</div>
				)}
			</div>
		);
	}

	const UploadConfirmMsgContainer = () => {
		return (
			<div className='edbi-file-browser__upload__confirmation'>
				<div dangerouslySetInnerHTML={{ __html: uploadConfirmMsg.replace(/\\n/g, '<br>').replace(/\\t/g, '') }}></div>
				<div className='edbi-file-browser__upload__confirmation__actions'>
					<button
						type='button'
						className='edbi-button edbi-button--primary'
						onClick={() => {
							setIsComplete(false);
							setAllFilesUploaded(false);
							setUploadedFiles([]);
							setQueue([]);
							setInProgress([]);
							setPendingPostUploads(0);
							setPercentage(0);
							filesRef.current = [];
						}}
					>
						{__('Upload Again', 'easy-dropbox-integration')}
					</button>
				</div>
			</div>
		);
	};

	const shouldDisplayUploadConfirmation = !isFormUploader && !isWooCommerceUploader && !uploadImmediately && showUploadConfirmation;
	const showUploadConfirmScreen = shouldDisplayUploadConfirmation && isComplete;

	return (
		<div
			className={
				classNames(
					'edbi-file-browser__upload', className ? className : '',
					isComplete ? 'edbi-file-browser__upload__complete' : '',
					showUploadConfirmScreen ? 'edbi-file-browser__upload__confirm' : ''
				)
			}
		>
			<div 
				className='edbi-uploader-container'
			>
				{
					showUploadConfirmScreen && (
						<UploadConfirmMsgContainer />
					)
				}
				
				{/* {
					RenderUploaderContainer()
				} */}

				<RenderUploaderContainer />
			</div>
		</div>
	);
};

export default Uploader;
