pragma ComponentBehavior: Bound

import QtQuick
import Quickshell
import Quickshell.Wayland
import qs.Common
import qs.Services

Scope {
    id: root

    required property var screen

    readonly property var barEdges: {
        SettingsData.barConfigs; // force re-eval when bar configs change
        return SettingsData.getActiveBarEdgesForScreen(screen);
    }

    // Overlay-layer bars stay standalone even in connected mode and reserve their own edge.
    readonly property var overlayBarEdges: {
        SettingsData.barConfigs;
        return SettingsData.getOverlayBarEdgesForScreen(root.screen);
    }

    // One thin invisible PanelWindow per edge. A standalone bar reserves its own edge, so
    // that edge is skipped — unless the frame hosts the bar (connected mode), where no bar
    // window exists and the exclusion must reserve the full bar thickness itself.

    readonly property bool screenEnabled: CompositorService.frameWindowVisibleForScreen(root.screen)
    readonly property bool hostsBar: CompositorService.frameHostsSurfacesForScreen(root.screen)

    function hostsBandForEdge(edge) {
        return root.hostsBar && !root.overlayBarEdges.includes(edge);
    }

    function exclusionSizeForEdge(edge) {
        return SettingsData.frameEdgeReservation(root.screen, edge);
    }

    Loader {
        readonly property bool isBarEdge: root.barEdges.includes("top")
        active: root.screenEnabled && (!isBarEdge || root.hostsBandForEdge("top"))
        sourceComponent: EdgeExclusion {
            targetScreen: root.screen
            exclusionSize: root.exclusionSizeForEdge("top")
            anchorTop: true
            anchorLeft: true
            anchorRight: true
        }
    }

    Loader {
        readonly property bool isBarEdge: root.barEdges.includes("bottom")
        active: root.screenEnabled && (!isBarEdge || root.hostsBandForEdge("bottom"))
        sourceComponent: EdgeExclusion {
            targetScreen: root.screen
            exclusionSize: root.exclusionSizeForEdge("bottom")
            anchorBottom: true
            anchorLeft: true
            anchorRight: true
        }
    }

    Loader {
        readonly property bool isBarEdge: root.barEdges.includes("left")
        active: root.screenEnabled && (!isBarEdge || root.hostsBandForEdge("left"))
        sourceComponent: EdgeExclusion {
            targetScreen: root.screen
            exclusionSize: root.exclusionSizeForEdge("left")
            anchorLeft: true
            anchorTop: true
            anchorBottom: true
        }
    }

    Loader {
        readonly property bool isBarEdge: root.barEdges.includes("right")
        active: root.screenEnabled && (!isBarEdge || root.hostsBandForEdge("right"))
        sourceComponent: EdgeExclusion {
            targetScreen: root.screen
            exclusionSize: root.exclusionSizeForEdge("right")
            anchorRight: true
            anchorTop: true
            anchorBottom: true
        }
    }

    component EdgeExclusion: PanelWindow {
        required property var targetScreen
        property real exclusionSize: SettingsData.frameThickness

        screen: targetScreen
        property bool anchorTop: false
        property bool anchorBottom: false
        property bool anchorLeft: false
        property bool anchorRight: false

        WlrLayershell.namespace: "dms:frame-exclusion"
        WlrLayershell.layer: WlrLayer.Top
        exclusiveZone: exclusionSize
        color: "transparent"
        mask: Region {}
        implicitWidth: 1
        implicitHeight: 1

        anchors {
            top: anchorTop
            bottom: anchorBottom
            left: anchorLeft
            right: anchorRight
        }
    }
}
