/*
 * Copyright (c) 2021. The Nextcloud Bookmarks contributors.
 *
 * This file is licensed under the Affero General Public License version 3 or later. See the COPYING file.
 */

export default {
	bind(el, binding) {
		const allowDrop = binding.value.allow
		const drop = binding.value.drop
		let dropTargetEntered = 0
		el.addEventListener('dragenter', (e) => {
			if (allowDrop(e)) {
				e.preventDefault()
				// for every descendant of this element, increment
				// when this is 0, the dropTarget class is removed
				dropTargetEntered++
				e.dataTransfer.dropEffect = 'move'
				if (dropTargetEntered === 1) {
					el.classList.add('dropTarget--active')
				}
			}
		})
		el.addEventListener('dragover', (e) => {
			if (allowDrop()) {
				e.preventDefault()
			}
		})
		el.addEventListener('dragleave', (e) => {
			// for every descendant of this element, decrement
			// when this is 0, the dropTarget class is removed
			dropTargetEntered = Math.max(0, dropTargetEntered - 1)
			if (dropTargetEntered === 0) {
				el.classList.remove('dropTarget--active')
			}
		})
		el.addEventListener('drop', (e) => {
			dropTargetEntered = 0
			drop(e)
			el.classList.remove('dropTarget--active')
			const targets = document.querySelectorAll('.dropTarget--available')
			targets.forEach(el => {
				el.classList.remove('dropTarget--available')
			})
		})
		window.document.body.addEventListener('dragend', (e) => {
			const targets = document.querySelectorAll('.dropTarget--available')
			targets.forEach(el => {
				el.classList.remove('dropTarget--available')
			})
		})
		window.document.body.addEventListener('dragstart', (e) => {
			if (allowDrop(e)) {
				el.classList.add('dropTarget--available')
			}
		})
	},
}
