import Quickshell.Bluetooth
import Quickshell.Networking as QSNetwork
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import qs.Components
import qs.Config
import qs.Helpers
import qs.Daemons

CustomRect {
	id: root

	required property Item popouts
	required property var visibilities

	Layout.fillWidth: true
	color: DynamicColors.tPalette.m3surfaceContainer
	implicitHeight: layout.implicitHeight + 18 * 2
	radius: Appearance.rounding.smallest

	ButtonRow {
		id: layout

		anchors.fill: parent
		anchors.margins: 18
		spacing: Appearance.spacing.extraSmall

		Toggle {
			checked: Network.wifiEnabled
			icon: Network.wifiEnabled ? "wifi" : "wifi_off"
			visible: QSNetwork.Networking.devices.values.some(n => n.type === QSNetwork.DeviceType.Wifi)

			onClicked: Network.toggleWifi()
		}

		Toggle {
			id: toggle

			checked: !NotifServer.dnd
			icon: NotifServer.dnd ? "notifications_off" : "notifications"

			onClicked: NotifServer.dnd = !NotifServer.dnd
		}

		Toggle {
			checked: !Audio.sourceMuted
			icon: Audio.sourceMuted ? "mic_off" : "mic"

			onClicked: {
				const audio = Audio.source?.audio;
				if (audio)
					audio.muted = !audio.muted;
			}
		}

		Toggle {
			checked: !Audio.muted
			icon: Audio.muted ? "volume_off" : "volume_up"

			onClicked: {
				const audio = Audio.sink?.audio;
				if (audio)
					audio.muted = !audio.muted;
			}
		}

		Toggle {
			checked: Bluetooth.defaultAdapter?.enabled ?? false
			icon: Bluetooth.defaultAdapter?.enabled ? "bluetooth" : "bluetooth_disabled"
			visible: Bluetooth.defaultAdapter ?? false

			onClicked: {
				const adapter = Bluetooth.defaultAdapter;
				if (adapter)
					adapter.enabled = !adapter.enabled;
			}
		}

		Toggle {
			checked: GameMode.enabled
			icon: GameMode.enabled ? "videogame_asset" : "videogame_asset_off"

			onClicked: GameMode.enabled = !GameMode.enabled
		}
	}

	CustomShortcut {
		name: "toggle-dnd"

		onPressed: {
			toggle.clicked();
		}
	}

	component Toggle: IconButton {
		fillWidth: true
		isRound: true
		isToggle: true
		shapeMorph: true
	}
}
