import { useCallback } from 'react';
import Note from '@joplin/lib/models/Note';
import { DragEvent as ReactDragEvent } from 'react';
import { DropCommandValue } from './types';
import { webUtils } from 'electron';

interface HookDependencies {
	// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
	editorRef: any;
}

// Returns true if Joplin handled the event
export type DropHandler = (event: DragEvent|ReactDragEvent)=> boolean;

export default function useDropHandler(dependencies: HookDependencies): DropHandler {
	const { editorRef } = dependencies;

	return useCallback((event: DragEvent|ReactDragEvent) => {
		if (!event.dataTransfer) return false;

		const dt = event.dataTransfer;
		const createFileURL = event.altKey;

		const eventPosition = {
			clientX: event.clientX,
			clientY: event.clientY,
		};

		if (dt.types.indexOf('text/x-jop-note-ids') >= 0) {
			const noteIds = JSON.parse(dt.getData('text/x-jop-note-ids'));

			const dropNotes = async () => {
				const noteMarkdownTags = [];
				for (let i = 0; i < noteIds.length; i++) {
					const note = await Note.load(noteIds[i]);
					noteMarkdownTags.push(Note.markdownTag(note));
				}

				const props: DropCommandValue = {
					type: 'notes',
					pos: eventPosition,
					markdownTags: noteMarkdownTags,
				};

				editorRef.current.execCommand({
					name: 'dropItems',
					value: props,
				});
			};
			void dropNotes();

			return true;
		}

		const files = dt.files;
		if (files && files.length) {
			const paths = [];
			for (let i = 0; i < files.length; i++) {
				const file = files[i];
				const path = webUtils.getPathForFile(file);
				if (!path) continue;
				paths.push(path);
			}

			if (paths.length > 0) {
				const props: DropCommandValue = {
					type: 'files',
					pos: eventPosition,
					paths: paths,
					createFileURL: createFileURL,
				};

				editorRef.current.execCommand({
					name: 'dropItems',
					value: props,
				});
				return true;
			}
		}

		return false;
		// eslint-disable-next-line @seiyab/react-hooks/exhaustive-deps -- Old code before rule was applied
	}, []);
}
