pragma ComponentBehavior: Bound

import Quickshell
import QtQuick
import ZShell.Config
import qs.Modules.Bar.Popouts
import qs.Components

Item {
	id: root

	readonly property int clampedExtent: Math.max(Config.bar.border, extent)
	readonly property int contentThickness: Math.floor(Math.max(Config.bar.height, Tokens.bar.innerSize * (horizontal ? 1 : 1.5))) + padding * 2
	readonly property int exclusiveZone: Config.bar.autoHide ? Config.bar.border : contentThickness
	property real extent: fullscreen ? 0 : Config.bar.border
	required property bool fullscreen
	readonly property bool horizontal: position !== "left"
	property bool isHovered
	readonly property int padding: Math.max(Tokens.padding.small, Config.bar.border)
	required property Wrapper popouts
	required property ClipWrapper popoutsWrapper
	required property string position
	required property ShellScreen screen
	readonly property bool shouldBeVisible: (!fullscreen && (!Config.bar.autoHide || visibilities.bar)) || isHovered
	readonly property int vPadding: 6
	required property PersistentProperties visibilities

	function checkPopout(pos: real): void {
		(content.item as Bar)?.checkPopout(pos);
	}

	function entryAt(pos: real): string {
		return (content.item as Bar)?.entryAt(pos) ?? "";
	}

	implicitHeight: extent
	implicitWidth: extent
	visible: extent > Config.bar.border

	states: State {
		name: "visible"
		when: root.shouldBeVisible

		PropertyChanges {
			root.extent: root.contentThickness
		}
	}
	transitions: [
		Transition {
			from: ""
			to: "visible"

			Anim {
				property: "extent"
				target: root
			}
		},
		Transition {
			from: "visible"
			to: ""

			Anim {
				property: "extent"
				target: root
			}
		}
	]

	Loader {
		id: content

		active: root.shouldBeVisible || root.visible
		anchors.bottom: root.position !== "bottom" ? parent.bottom : undefined
		anchors.left: root.horizontal ? parent.left : undefined
		anchors.right: parent.right
		anchors.top: root.position !== "top" ? parent.top : undefined
		height: root.contentThickness
		width: root.contentThickness

		sourceComponent: Bar {
			fullscreen: root.fullscreen
			height: root.contentThickness
			horizontal: root.horizontal
			isHovered: root.isHovered
			popouts: root.popouts
			popoutsWrapper: root.popoutsWrapper
			screen: root.screen
			visibilities: root.visibilities
		}
	}
}
