/**
 * Custom hook for handling drag-and-drop from asset carousel to file inputs
 * Enables dragging assets from "My Files" carousel into batch processing tools
 */

import { useEffect } from 'react';

interface UseDragFromCarouselOptions {
    onAssetDrop: (assetIds: string[]) => void;
    enabled?: boolean;
}

export function useDragFromCarousel({ onAssetDrop, enabled = true }: UseDragFromCarouselOptions) {
    useEffect(() => {
        if (!enabled) return;

        const handleDragOver = (e: DragEvent) => {
            // Check if dragging from carousel (has asset-id data)
            const types = Array.from(e.dataTransfer?.types || []);
            if (types.includes('application/x-asset-id')) {
                e.preventDefault();
                e.stopPropagation();
                e.dataTransfer!.dropEffect = 'copy';

                // Add visual feedback
                const target = e.currentTarget as HTMLElement;
                if (target) {
                    target.classList.add('drag-over');
                }
            }
        };

        const handleDragLeave = (e: DragEvent) => {
            const target = e.currentTarget as HTMLElement;
            if (target) {
                target.classList.remove('drag-over');
            }
        };

        const handleDrop = (e: DragEvent) => {
            const types = Array.from(e.dataTransfer?.types || []);

            // Only handle if it's our asset drag
            if (types.includes('application/x-asset-id')) {
                e.preventDefault();
                e.stopPropagation();

                const target = e.currentTarget as HTMLElement;
                if (target) {
                    target.classList.remove('drag-over');
                }

                // Get asset ID from drag data
                const assetId = e.dataTransfer?.getData('application/x-asset-id');

                if (assetId) {
                    // Single asset
                    onAssetDrop([assetId]);
                }
            }
        };

        const attachListeners = () => {
            // Find all file upload drop zones
            const dropZones = document.querySelectorAll('[data-file-drop-zone]');

            dropZones.forEach(zone => {
                zone.addEventListener('dragover', handleDragOver as EventListener);
                zone.addEventListener('dragleave', handleDragLeave as EventListener);
                zone.addEventListener('drop', handleDrop as EventListener);
            });

            return dropZones;
        };

        // Initial attachment with a small delay to ensure DOM is ready
        const timeoutId = setTimeout(() => {
            attachListeners();
        }, 100);

        // Also try to attach immediately
        const initialZones = attachListeners();

        return () => {
            clearTimeout(timeoutId);

            // Clean up all drop zones
            const dropZones = document.querySelectorAll('[data-file-drop-zone]');
            dropZones.forEach(zone => {
                zone.removeEventListener('dragover', handleDragOver as EventListener);
                zone.removeEventListener('dragleave', handleDragLeave as EventListener);
                zone.removeEventListener('drop', handleDrop as EventListener);
            });
        };
    }, [onAssetDrop, enabled]);
}
