pragma ComponentBehavior: Bound

import QtQuick
import ZShell.Config
import qs.Components
import qs.Helpers
import qs.Services

Item {
	id: root

	required property var bar
	property color color: Colors.palette.m3primary
	property Title current: text1
	required property bool horizontal
	// readonly property int maxWidth: 300
	readonly property int maxSize: {
		const otherModules = bar.children.filter(c => c.enabled && c.entryId && c.item !== this && c.entryId !== "spacer");
		const otherSize = otherModules.reduce((acc, curr) => acc + (horizontal ? (curr.item?.nonAnimWidth ?? curr.width ?? 0) : (curr.item.nonAnimHeight ?? curr.height ?? 0)), 0);
		return horizontal ? (bar.width - otherSize - bar.columnSpacing * (bar.children.length - 1) - bar.vPadding * 2) : (bar.height - otherSize - bar.rowSpacing * (bar.children.length - 1) - bar.vPadding * 4);
	}

	clip: true
	implicitHeight: horizontal ? current.implicitHeight : current.implicitWidth + current.anchors.topMargin
	implicitWidth: horizontal ? current.implicitWidth + current.anchors.leftMargin : current.implicitHeight + current.anchors.topMargin

	Behavior on implicitHeight {
		enabled: !root.horizontal

		Anim {
			type: Anim.DefaultEffects
		}
	}
	Behavior on implicitWidth {
		enabled: root.horizontal

		Anim {
			type: Anim.DefaultEffects
		}
	}

	Title {
		id: text1
	}

	Title {
		id: text2
	}

	TextMetrics {
		id: metrics

		elide: Qt.ElideRight
		elideWidth: root.maxSize - (root.horizontal ? root.current.anchors.leftMargin : 0)
		font.family: "Rubik"
		font.pointSize: Tokens.font.size.normal
		text: Hypr.activeToplevel?.title ?? qsTr("Desktop")

		onElideWidthChanged: root.current.text = elidedText
		onTextChanged: {
			const next = root.current === text1 ? text2 : text1;
			next.text = elidedText;
			root.current = next;
		}
	}

	component Title: CustomText {
		id: text

		anchors.horizontalCenter: root.horizontal ? undefined : parent.horizontalCenter
		anchors.left: root.horizontal ? parent.left : undefined
		anchors.leftMargin: root.horizontal ? Tokens.spacing.small : 0
		anchors.top: root.horizontal ? undefined : parent.top
		anchors.topMargin: root.horizontal ? 0 : Tokens.spacing.small
		anchors.verticalCenter: root.horizontal ? parent.verticalCenter : undefined
		color: root.color
		font.family: metrics.font.family
		font.pointSize: metrics.font.pointSize
		height: root.horizontal ? implicitHeight : implicitWidth
		opacity: root.current === this ? 1 : 0
		width: root.horizontal ? implicitWidth : implicitHeight

		Behavior on opacity {
			Anim {
			}
		}
		transform: [
			Translate {
				x: !root.horizontal ? -text.implicitWidth + text.implicitHeight : 0
			},
			Rotation {
				angle: root.horizontal ? 0 : 270
				origin.x: text.implicitHeight / 2
				origin.y: text.implicitHeight / 2
			}
		]
	}
}
