# Copyright 2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

inherit desktop optfeature shell-completion systemd tmpfiles xdg-utils

DESCRIPTION="Desktop shell for wayland compositors built with Quickshell"
HOMEPAGE="https://github.com/AvengeMedia/DankMaterialShell"
# dms-cli tarball includes vendored Go deps; dms-qml contains the QML shell
SRC_URI="https://github.com/AvengeMedia/DankMaterialShell/releases/download/v${PV}/dms-cli-${PV}.tar.gz
	https://github.com/AvengeMedia/DankMaterialShell/releases/download/v${PV}/dms-qml.tar.gz -> dms-qml-${PV}.tar.gz"

S="${WORKDIR}/dms-cli-${PV}"

LICENSE="MIT"
SLOT="0"
KEYWORDS="~amd64 ~arm64"
IUSE="cups greeter"

DEPEND="
	dev-qt/qtbase:6[dbus,wayland,opengl,vulkan,widgets]
	dev-qt/qtdeclarative:6[opengl,vulkan]
	dev-qt/qtmultimedia:6[dbus,opengl,vulkan,wayland]
	dev-qt/qtshadertools:6
	dev-qt/qtwayland:6
	gui-apps/quickshell
	sys-apps/accountsservice
	sys-apps/xdg-desktop-portal-gtk[wayland]
	sys-power/upower
	kde-frameworks/kimageformats
	cups? ( net-print/cups-pk-helper )
	greeter? ( gui-libs/greetd )
"
RDEPEND="
	${DEPEND}
	app-misc/jq
"
BDEPEND="
	dev-lang/go
	dev-util/pkgconf
"

# set variables
QML_DIR="${WORKDIR}"/dms # qml assets location
GRT_DIR="${QML_DIR}"/Modules/Greetd  # greeter location

_dms_goarch() {
	case $(uname -m) in
		x86_64)  echo amd64 ;;
		aarch64) echo arm64 ;;
		*) die "unsupported arch: $(uname -m)" ;;
	esac
}

src_unpack() {
	# unpack dms source
	unpack dms-cli-"${PV}".tar.gz
	# unpack QML assets in ${QML_DIR}
	mkdir -p ${QML_DIR} || die "failed to create directory: ${QML_DIR}"
	cd "${QML_DIR}" || die "cd into ${QML_DIR} failed"
	unpack dms-qml-"${PV}".tar.gz
}

src_configure() {
	if use greeter; then
		# set DMS_PATH: /usr/share/quickshell/dms
		sed -i 's|^DMS_PATH=.*$|DMS_PATH="/usr/share/quickshell/dms"|' \
			"${GRT_DIR}"/assets/dms-greeter || die

		# fix tmpfile usergroup: greeter -> greetd
		sed -i "s/\sgreeter/ greetd/g" \
			"${QML_DIR}"/systemd/tmpfiles-dms-greeter.conf || die
	fi
}

src_compile() {
	# build dms binary from vendored source
	emake VERSION="${PV}" dist

	local goarch=$(_dms_goarch)

	# generate shell completions
	"${S}"/bin/dms-linux-${goarch} completion bash > "${S}"/dms-bashcomp || die
	"${S}"/bin/dms-linux-${goarch} completion zsh > "${S}"/dms-zshcomp || die
}

src_test() {
	cd "${S}" || die
	CGO_ENABLED=0 go test ./... || true
}

src_install() {
	local goarch=$(_dms_goarch)

	# install dms binary
	newbin "${S}"/bin/dms-linux-${goarch} dms

	if use greeter; then
		dobin "${GRT_DIR}"/assets/dms-greeter
		newtmpfiles "${QML_DIR}"/systemd/tmpfiles-dms-greeter.conf dms-greeter.conf
	fi

	# install qml sources at /usr/share/quickshell/dms
	insinto /usr/share/quickshell
	doins -r "${QML_DIR}"

	# install shell completions
	newbashcomp "${S}"/dms-bashcomp dms
	newzshcomp "${S}"/dms-zshcomp _dms

	# systemd unit
	systemd_douserunit "${QML_DIR}"/assets/systemd/dms.service

	# desktop entry and icon
	domenu "${QML_DIR}"/assets/dms-open.desktop
	doicon -s scalable "${QML_DIR}"/assets/danklogo.svg
}

pkg_postinst() {
	use greeter && tmpfiles_process dms-greeter.conf
	xdg_desktop_database_update
	xdg_icon_cache_update

	optfeature_header "Optional programs for extra features:"
	optfeature "Audio visualizer"               media-sound/cava
	optfeature "I2C monitor brightness control" app-misc/ddcutil
	optfeature "Power profile options"          sys-power/power-profiles-daemon
	optfeature "Volume & Speaker control"       media-video/wireplumber
	optfeature "Bluetooth & file transfer"      net-wireless/bluez
	optfeature "Calendar integration"           app-misc/khal
	optfeature "Fingerprint unlock notifier"    sys-auth/fprintfd
	optfeature "Wallpaper based colorscheme"    x11-misc/matugen
	optfeature "Wifi & Ethernet connection"     net-misc/networkmanager

	if use greeter; then
		elog "To use dms-greeter as your default greetd greeter run the following:"
		elog "  \$ dms greeter enable"
		elog "  \$ systemctl disable --now gdm.service sddm.service lightdm.service"
		elog "  \$ systemctl enable --now greetd.service"
	fi
}

pkg_postrm() {
	xdg_desktop_database_update
	xdg_icon_cache_update
}