// SPDX-License-Identifier: LGPL-3.0-or-later

import QtQuick 2.12
import Clipboard 0.1

FocusScope {
    signal deselectAll()
    signal dragStarted()
    signal dragStopped()
    signal dragPointChanged(var eventPoint)


    property bool reversed: false

    property bool selecting: false
    property real selectionStart: -1
    property real selectionEnd: -1
    property point selectionStartPosition: Qt.point(-1, -1)
    property point selectionEndPosition: Qt.point(-1, -1)
    property var selectedTexts: ({})

    readonly property var selectionInfo: [
        selectionStart, selectionStartPosition,
        selectionEnd, selectionEndPosition,
    ]

    readonly property string joinedSelection: {
        const toCopy = []

        for (const key of Object.keys(selectedTexts).sort()) {
            if (! selectedTexts[key]) continue

            // For some dumb reason, Object.keys convert the floats to strings
            toCopy.push(Number.isInteger(parseFloat(key)) ? "\n\n" : "\n")
            toCopy.push(selectedTexts[key])
        }

        if (reversed) toCopy.reverse()

        return toCopy.join("").trim()
    }


    onJoinedSelectionChanged:
        if (joinedSelection) Clipboard.selection = joinedSelection

    onDragStarted: {
        draggedItem.Drag.active = true
    }
    onDragStopped: {
        draggedItem.Drag.drop()
        draggedItem.Drag.active = false
        selecting               = false
    }
    onDragPointChanged: {
        const pos = mapFromItem(
            mainUI, eventPoint.scenePosition.x, eventPoint.scenePosition.y,
        )
        draggedItem.x = pos.x
        draggedItem.y = pos.y
    }


    function clearSelection() {
        selecting              = false
        selectionStart         = -1
        selectionEnd           = -1
        selectionStartPosition = Qt.point(-1, -1)
        selectionEndPosition   = Qt.point(-1, -1)
        deselectAll()
    }


    // PointHandler and TapHandler won't activate if the press occurs inside
    // a label child, so we need a Point/TapHandler inside them too.

    PointHandler {
        // We don't use a DragHandler because they have an unchangable minimum
        // drag distance before they activate.
        id: pointHandler
        onActiveChanged: active ? dragStarted() : dragStopped()
        onPointChanged: dragPointChanged(point)
    }

    TapHandler {
        acceptedButtons: Qt.LeftButton
        onTapped: clearSelection()
    }

    // This item will trigger the children labels's DropAreas
    Item { id: draggedItem }
}
