import Quickshell
import Quickshell.Io
import Quickshell.Widgets

import QtQuick
import QtQuick.Layouts
import QtQuick.Effects
import QtQuick.Controls

import qs.config
import qs.modules.components
import qs.modules.functions

StyledRect {
    id: root
    property bool hovered: false
    property bool selected: false

    required property int parentWidth

	width: parentWidth
    height: 50
    color: {
        if (selected || hovered)
            return Appearance.m3colors.m3surfaceContainerHigh
        else
            return Appearance.m3colors.m3surface
    }
    radius: Metrics.radius(15)

    Behavior on color {
		PropertyAnimation {
			duration: Metrics.chronoDuration(200)
			easing.type: Easing.InSine
		}
	}

    ClippingWrapperRectangle {
        id: entryIcon
        anchors.left: parent.left
        anchors.leftMargin: Metrics.margin(10)

        anchors.top: parent.top
        anchors.topMargin: (parent.height / 2) - (size / 2)

        property int size: 25
        height: size
        width: size
        radius: Metrics.radius(1000)

        color: "transparent"

        child: Image {
            source: Quickshell.iconPath(modelData.icon, "application-x-executable")
            layer.enabled: true
            layer.effect: MultiEffect { // Tint if needed, ngl this looks fucking cool when you use monochrome
                saturation: (Config.runtime.appearance.tintIcons || (Config.runtime.appearance.colors.matugenScheme === "scheme-monochrome" && Config.runtime.appearance.colors.autogenerated) || Config.runtime.appearance.colors.scheme.toLowerCase() === "monochrome") ? -1.0 : 1.0
            }
        }
    }

    ColumnLayout {
        anchors.left: entryIcon.right
        anchors.leftMargin: Metrics.margin(10)
        anchors.top: parent.top
        anchors.topMargin: (parent.height / 2) - (height / 2)

        height: 40
        spacing: Metrics.spacing(-5)

        StyledText {
            font.weight: 400
            text: modelData.name
            font.pixelSize: Metrics.fontSize(14)
            color: {
                if (root.hovered || root.selected)
                    return Appearance.m3colors.m3onSurface
                else
                    return Appearance.colors.colOutline
            }

            Behavior on color {
                PropertyAnimation {
                    duration: Metrics.chronoDuration(200)
                    easing.type: Easing.InSine
                }
            }
        }

        StyledText {
            font.weight: 400
            text: StringUtils.shortText(modelData.comment, 65) // Limit maximum chars to 65
            font.pixelSize: Metrics.fontSize(12)
            color: {
                if (root.hovered || root.selected)
                    return Qt.alpha(Appearance.m3colors.m3onSurface, 0.7)
                else
                    return Qt.alpha(Appearance.colors.colOutline, 0.7)
            }

            Behavior on color {
                PropertyAnimation {
                    duration: Metrics.chronoDuration(200)
                    easing.type: Easing.InSine
                }
            }
        }
    }

    MouseArea {
        anchors.fill: parent
        hoverEnabled: true
        cursorShape: Qt.PointingHandCursor

        onEntered: root.hovered = true
        onExited: root.hovered = false
        onClicked: {
            modelData.execute()
            IPCLoader.toggleLauncher()
        }
    }
}
