import QtQuick
import QtQuick.Controls
import Quickshell
import Quickshell.Services.Pipewire
import qs.Common
import qs.Services
import qs.Widgets

Row {
    id: root

    property var defaultSource: AudioService.source
    property color sliderTrackColor: "transparent"

    height: 40
    spacing: 0

    Rectangle {
        width: Theme.iconSize + Theme.spacingS * 2
        height: Theme.iconSize + Theme.spacingS * 2
        anchors.verticalCenter: parent.verticalCenter
        radius: (Theme.iconSize + Theme.spacingS * 2) / 2
        color: iconArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) : Theme.withAlpha(Theme.primary, 0)

        MouseArea {
            id: iconArea
            anchors.fill: parent
            visible: defaultSource !== null
            hoverEnabled: true
            cursorShape: Qt.PointingHandCursor
            onClicked: {
                if (defaultSource) {
                    AudioService.suppressOSD = true
                    defaultSource.audio.muted = !defaultSource.audio.muted
                    AudioService.suppressOSD = false
                }
            }
        }

        DankIcon {
            anchors.centerIn: parent
            name: {
                if (!defaultSource) return "mic_off"

                let volume = defaultSource.audio.volume
                let muted = defaultSource.audio.muted

                if (muted || volume === 0.0) return "mic_off"
                return "mic"
            }
            size: Theme.iconSize
            color: defaultSource && !defaultSource.audio.muted && defaultSource.audio.volume > 0 ? Theme.primary : Theme.surfaceText
        }
    }

    DankSlider {
        readonly property real actualVolumePercent: defaultSource ? Math.round(defaultSource.audio.volume * 100) : 0

        anchors.verticalCenter: parent.verticalCenter
        width: parent.width - (Theme.iconSize + Theme.spacingS * 2)
        enabled: defaultSource !== null
        minimum: 0
        maximum: 100
        value: defaultSource ? Math.min(100, Math.round(defaultSource.audio.volume * 100)) : 0
        showValue: true
        unit: "%"
        valueOverride: actualVolumePercent
        thumbOutlineColor: Theme.surfaceContainer
        trackColor: root.sliderTrackColor.a > 0 ? root.sliderTrackColor : Theme.surfaceContainerHigh
        onIsDraggingChanged: {
            AudioService.suppressOSD = isDragging
        }
        onSliderValueChanged: function(newValue) {
            if (defaultSource) {
                defaultSource.audio.volume = newValue / 100.0
                if (newValue > 0 && defaultSource.audio.muted) {
                    defaultSource.audio.muted = false
                }
            }
        }
    }
}