pragma ComponentBehavior: Bound

import QtQuick
import QtQuick.Layouts
import Quickshell
import qs.Components
import ZShell.Config
import qs.Services

Item {
	id: root

	property alias imgHeight: imgWrapper.implicitHeight
	property alias radius: imgWrapper.radius
	property alias source: img.source

	signal clicked

	Layout.fillWidth: true
	implicitHeight: layout.implicitHeight

	ColumnLayout {
		id: layout

		anchors.fill: parent
		spacing: Tokens.spacing.small

		CustomClippingRect {
			id: imgWrapper

			Layout.fillWidth: true
			color: Colors.tPalette.m3surfaceContainer
			implicitHeight: width
			radius: Tokens.rounding.largeIncreased

			Loader {
				active: opacity > 0
				anchors.centerIn: parent
				opacity: img.status === Image.Ready ? 0 : 1

				Behavior on opacity {
					Anim {
					}
				}
				sourceComponent: CustomRect {
					color: Colors.palette.m3primaryContainer
					implicitHeight: loadingIndicator.implicitSize + Tokens.padding.large * 2
					implicitWidth: loadingIndicator.implicitSize + Tokens.padding.large * 2
					radius: Tokens.rounding.full

					LoadingIndicator {
						id: loadingIndicator

						anchors.centerIn: parent
						containsIcon: true
						implicitSize: Math.min(imgWrapper.width, imgWrapper.height) * 0.3
					}
				}
			}

			Image {
				id: img

				anchors.fill: parent
				asynchronous: true
				fillMode: Image.PreserveAspectCrop
				opacity: status === Image.Ready ? 1 : 0
				retainWhileLoading: true
				sourceSize: {
					const dpr = (QsWindow.window as QsWindow)?.devicePixelRatio ?? 1;
					return Qt.size(width * dpr, height * dpr);
				}

				Behavior on opacity {
					Anim {
						type: Anim.SlowEffects
					}
				}
			}
		}
	}

	StateLayer {
		anchors.bottomMargin: layout.implicitHeight - imgWrapper.implicitHeight

		onClicked: root.clicked()
	}
}
