import "root:/"
import "root:/modules/common"
import "root:/modules/common/widgets"
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell
import Quickshell.Io
import Quickshell.Wayland
import Quickshell.Hyprland

Scope {
    id: root

    Variants {
        model: Quickshell.screens

        Loader {
            id: overviewLoader
            active: GlobalStates.overviewOpen
            property var modelData

            PanelWindow {
                id: root
                property string searchingText: ""
                readonly property HyprlandMonitor monitor: Hyprland.monitorFor(root.screen)
                property bool monitorIsFocused: (Hyprland.focusedMonitor?.id == monitor.id)
                screen: modelData
                visible: true

                WlrLayershell.namespace: "quickshell:overview"
                WlrLayershell.layer: WlrLayer.Overlay
                WlrLayershell.keyboardFocus: GlobalStates.overviewOpen ? WlrKeyboardFocus.OnDemand : WlrKeyboardFocus.None
                color: "transparent"

                mask: Region {
                    item: GlobalStates.overviewOpen ? columnLayout : null
                }

                anchors {
                    top: true
                    left: true
                    right: true
                    bottom: true
                }

                HyprlandFocusGrab {
                    id: grab
                    windows: [ root ]
                    property bool canBeActive: root.monitorIsFocused
                    active: false
                    onCleared: () => {
                        if (!active) GlobalStates.overviewOpen = false
                    }
                }

                Connections {
                    target: GlobalStates
                    function onOverviewOpenChanged() {
                        delayedGrabTimer.start()
                    }
                }

                Timer {
                    id: delayedGrabTimer
                    interval: ConfigOptions.hacks.arbitraryRaceConditionDelay
                    repeat: false
                    onTriggered: {
                        if (!grab.canBeActive) return
                        grab.active = GlobalStates.overviewOpen
                    }
                }

                implicitWidth: columnLayout.width
                implicitHeight: columnLayout.height

                ColumnLayout {
                    id: columnLayout
                    visible: GlobalStates.overviewOpen
                    anchors.horizontalCenter: parent.horizontalCenter

                    Keys.onPressed: (event) => {
                        if (event.key === Qt.Key_Escape) {
                            GlobalStates.overviewOpen = false;
                        }
                    }

                    Item {
                        height: 1 // Prevent Wayland protocol error
                        width: 1 // Prevent Wayland protocol error
                    }

                    SearchWidget {
                        panelWindow: root
                        Layout.alignment: Qt.AlignHCenter
                        onSearchingTextChanged: (text) => {
                            root.searchingText = searchingText
                        }
                    }

                    OverviewWidget {
                        panelWindow: root
                        visible: (root.searchingText == "")
                    }
                }

            }
        }

    }

    IpcHandler {
		target: "overview"

        function toggle() {
            GlobalStates.overviewOpen = !GlobalStates.overviewOpen
        }
        function close() {
            GlobalStates.overviewOpen = false
        }
        function open() {
            GlobalStates.overviewOpen = true
        }
        function toggleReleaseInterrupt() {
            GlobalStates.superReleaseMightTrigger = false
        }
	}

    GlobalShortcut {
        name: "overviewToggle"
        description: "Toggles overview on press"

        onPressed: {
            GlobalStates.overviewOpen = !GlobalStates.overviewOpen   
        }
    }
    GlobalShortcut {
        name: "overviewClose"
        description: "Closes overview"

        onPressed: {
            GlobalStates.overviewOpen = false
        }
    }
    GlobalShortcut {
        name: "overviewToggleRelease"
        description: "Toggles overview on release"

        onPressed: {
            GlobalStates.superReleaseMightTrigger = true
        }

        onReleased: {
            if (!GlobalStates.superReleaseMightTrigger) {
                GlobalStates.superReleaseMightTrigger = true
                return
            }
            GlobalStates.overviewOpen = !GlobalStates.overviewOpen   
        }
    }
    GlobalShortcut {
        name: "overviewToggleReleaseInterrupt"
        description: "Interrupts possibility of overview being toggled on release. " +
            "This is necessary because GlobalShortcut.onReleased in quickshell triggers whether or not you press something else while holding the key. " +
            "To make sure this works consistently, use binditn = MODKEYS, catchall in an automatically triggered submap that includes everything."

        onPressed: {
            GlobalStates.superReleaseMightTrigger = false
        }
    }

}
