import qs.Config
import QtQuick

CustomRect {
	id: root

	enum Type {
		Filled,
		Tonal,
		Text
	}

	property color activeColour: type === IconButton.Filled ? DynamicColors.palette.m3primary : DynamicColors.palette.m3secondary
	property color activeOnColour: type === IconButton.Filled ? DynamicColors.palette.m3onPrimary : type === IconButton.Tonal ? DynamicColors.palette.m3onSecondary : DynamicColors.palette.m3primary
	property bool checked
	property bool disabled
	property color disabledColour: Qt.alpha(DynamicColors.palette.m3onSurface, 0.1)
	property color disabledOnColour: Qt.alpha(DynamicColors.palette.m3onSurface, 0.38)
	property alias font: label.font
	property alias icon: label.text
	property color inactiveColour: {
		if (!toggle && type === IconButton.Filled)
			return DynamicColors.palette.m3primary;
		return type === IconButton.Filled ? DynamicColors.tPalette.m3surfaceContainer : DynamicColors.palette.m3secondaryContainer;
	}
	property color inactiveOnColour: {
		if (!toggle && type === IconButton.Filled)
			return DynamicColors.palette.m3onPrimary;
		return type === IconButton.Tonal ? DynamicColors.palette.m3onSecondaryContainer : DynamicColors.palette.m3onSurfaceVariant;
	}
	property bool internalChecked
	property alias label: label
	property real padding: type === IconButton.Text ? 10 / 2 : 7
	property alias radiusAnim: radiusAnim
	property alias stateLayer: stateLayer
	property bool toggle
	property int type: IconButton.Filled

	signal clicked

	color: type === IconButton.Text ? "transparent" : disabled ? disabledColour : internalChecked ? activeColour : inactiveColour
	implicitHeight: label.implicitHeight + padding * 2
	implicitWidth: implicitHeight
	radius: internalChecked ? 6 : (implicitHeight / 2 * Math.min(1, 1)) * Appearance.rounding.scale

	Behavior on radius {
		Anim {
			id: radiusAnim
		}
	}

	onCheckedChanged: internalChecked = checked

	StateLayer {
		id: stateLayer

		color: root.internalChecked ? root.activeOnColour : root.inactiveOnColour
		disabled: root.disabled

		onClicked: {
			if (root.toggle)
				root.internalChecked = !root.internalChecked;
			root.clicked();
		}
	}

	MaterialIcon {
		id: label

		anchors.centerIn: parent
		color: root.disabled ? root.disabledOnColour : root.internalChecked ? root.activeOnColour : root.inactiveOnColour
		fill: !root.toggle || root.internalChecked ? 1 : 0

		Behavior on fill {
			Anim {
			}
		}
	}
}
