pragma ComponentBehavior: Bound

import QtQuick
import qs.Components
import qs.Helpers
import qs.Config

Item {
	id: root

	property Image current: one
	property string source: Wallpapers.current

	anchors.fill: parent

	Component.onCompleted: {
		if (source)
			Qt.callLater(() => one.update());
	}
	onSourceChanged: {
		if (!source) {
			current = null;
		} else if (current === one) {
			two.update();
		} else {
			one.update();
		}
	}

	Img {
		id: one

	}

	Img {
		id: two

	}

	component Img: CachingImage {
		id: img

		function update(): void {
			if (path === root.source) {
				root.current = this;
			} else {
				path = root.source;
			}
		}

		anchors.fill: undefined
		asynchronous: true
		opacity: 0
		fillMode: Image.Stretch
		
		property real windowRatio: root.width / Math.max(1, root.height)
		property real imageRatio: Math.max(1, sourceSize.width) / Math.max(1, sourceSize.height)
		
		property bool isValid: sourceSize.width > 0 && sourceSize.height > 0 && root.width > 0 && root.height > 0

		width: isValid ? (imageRatio > windowRatio ? root.height * imageRatio : root.width) * Config.background.zoom : root.width
		height: isValid ? (imageRatio > windowRatio ? root.height : root.width / imageRatio) * Config.background.zoom : root.height

		x: isValid ? (root.width - width) * Config.background.alignX : 0
		y: isValid ? (root.height - height) * Config.background.alignY : 0

		scale: Wallpapers.showPreview ? 1 : 0.8

		states: State {
			name: "visible"
			when: root.current === img

			PropertyChanges {
				img.opacity: 1
				img.scale: 1
			}
		}
		transitions: Transition {
			Anim {
				duration: Config.background.wallFadeDuration
				properties: "opacity,scale"
				target: img
			}
		}

		onStatusChanged: {
			if (status === Image.Ready) {
				root.current = this;
			}
		}
	}
}
