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

EAPI=8

inherit desktop pax-utils xdg

# Upstream has not tagged since 0.6.1 (2021-11); master carries years of
# fixes (TLS SNI, SHA512, dark mode, Thunderbird import, Electron bumps).
SIEVE_COMMIT="f08b3172ca6c1f5b016426305cbbc845d2374fb0"

# Upstream pins electron ^35 (EOL 2025-09).  The renderer runs with
# nodeIntegration and without contextIsolation, so stay on a supported
# Chromium.  The main process only uses long-stable APIs.
ELECTRON_PV="45.2.1"
# Versions match upstream's package-lock.json.
BOOTSTRAP_PV="5.3.3"
CODEMIRROR_PV="5.65.18"

DESCRIPTION="Standalone editor for server-side Sieve mail filters (ManageSieve)"
HOMEPAGE="https://github.com/thsmi/sieve"
SRC_URI="
	https://github.com/thsmi/sieve/archive/${SIEVE_COMMIT}.tar.gz -> ${P}.gh.tar.gz
	https://registry.npmjs.org/bootstrap/-/bootstrap-${BOOTSTRAP_PV}.tgz
	https://registry.npmjs.org/codemirror/-/codemirror-${CODEMIRROR_PV}.tgz
	amd64? (
		https://github.com/electron/electron/releases/download/v${ELECTRON_PV}/electron-v${ELECTRON_PV}-linux-x64.zip
	)
	arm64? (
		https://github.com/electron/electron/releases/download/v${ELECTRON_PV}/electron-v${ELECTRON_PV}-linux-arm64.zip
	)
"
S="${WORKDIR}/sieve-${SIEVE_COMMIT}"

LICENSE="AGPL-3 MIT"
# From www-client/chromium for the bundled Electron runtime
LICENSE+=" Apache-2.0 Apache-2.0-with-LLVM-exceptions BSD BSD-2 Base64 Boost-1.0 CC-BY-3.0 CC-BY-4.0 Clear-BSD FFT2D FTL"
LICENSE+=" IJG ISC LGPL-2 LGPL-2.1 MPL-1.1 MPL-2.0 Ms-PL PSF-2 SGI-B-2.0 SSLeay SunSoft Unicode-3.0"
LICENSE+=" Unicode-DFS-2015 Unlicense UoI-NCSA ZLIB libtiff openssl"
# From net-libs/nodejs
LICENSE+=" Apache-1.1 BlueOak-1.0.0"
SLOT="0"
KEYWORDS="-* ~amd64"
RESTRICT="bindist mirror splitdebug test"

RDEPEND="
	>=app-accessibility/at-spi2-core-2.46.0:2
	dev-libs/expat
	dev-libs/glib:2
	dev-libs/nspr
	dev-libs/nss
	media-libs/alsa-lib
	media-libs/mesa[opengl]
	net-print/cups
	sys-apps/dbus
	virtual/udev
	x11-libs/cairo
	x11-libs/gtk+:3
	x11-libs/libdrm
	x11-libs/libX11
	x11-libs/libxcb
	x11-libs/libxkbcommon
	x11-libs/libXcomposite
	x11-libs/libXdamage
	x11-libs/libXext
	x11-libs/libXfixes
	x11-libs/libXrandr
	x11-libs/pango
"
BDEPEND="app-arch/unzip"

APPDIR="opt/${PN}"

QA_PREBUILT="
	${APPDIR}/chrome_crashpad_handler
	${APPDIR}/chrome-sandbox
	${APPDIR}/libffmpeg.so
	${APPDIR}/libvk_swiftshader.so
	${APPDIR}/libvulkan.so.1
	${APPDIR}/sieve
"

src_unpack() {
	local electron_arch=x64
	use arm64 && electron_arch=arm64

	unpack "${P}.gh.tar.gz"

	# Both npm tarballs extract into package/, keep them apart.
	local npm
	for npm in bootstrap-${BOOTSTRAP_PV} codemirror-${CODEMIRROR_PV}; do
		mkdir "${WORKDIR}/${npm%-*}" || die
		tar -xzf "${DISTDIR}/${npm}.tgz" -C "${WORKDIR}/${npm%-*}" \
			--strip-components=1 || die
	done

	mkdir "${WORKDIR}/electron" || die
	cd "${WORKDIR}/electron" || die
	unpack "electron-v${ELECTRON_PV}-linux-${electron_arch}.zip"
}

# Mirrors gulp "app:package" (gulp/gulpfile.app.mjs) without npm/gulp.
src_compile() {
	local res="${WORKDIR}/resources" libs="${WORKDIR}/resources/libs"
	local cm="${WORKDIR}/codemirror" bs="${WORKDIR}/bootstrap/dist"
	local common="${S}/src/common" app="${S}/src/app"

	mkdir -p "${libs}"/{CodeMirror/{addon,mode,theme},bootstrap/{css,js}} || die

	cp package.json LICENSE.md "${res}"/ || die
	cp -r "${common}"/icons "${libs}"/ || die

	cp -r "${cm}"/lib "${cm}"/LICENSE "${cm}"/package.json "${libs}"/CodeMirror/ || die
	cp -r "${cm}"/addon/{edit,search} "${libs}"/CodeMirror/addon/ || die
	cp -r "${cm}"/mode/sieve "${libs}"/CodeMirror/mode/ || die
	cp "${cm}"/theme/{eclipse,material-darker}.css "${libs}"/CodeMirror/theme/ || die

	cp "${bs}"/css/*.min.css "${libs}"/bootstrap/css/ || die
	cp "${bs}"/js/*.bundle.min.js "${libs}"/bootstrap/js/ || die

	# libManageSieve: app-specific files plus the common ones.
	cp -r "${app}"/libs/libManageSieve "${libs}"/ || die
	cp -r "${common}"/libManageSieve/. "${libs}"/libManageSieve/ || die
	rm -rf "${libs}"/libManageSieve/{doc,tests} || die

	cp -r "${common}"/libSieve "${libs}"/ || die
	find "${libs}"/libSieve -name tests -type d -prune -exec rm -r {} + || die
	find "${libs}"/libSieve -name 'rfc*.txt' -delete || die

	cp -r "${common}"/managesieve.ui "${libs}"/ || die
	rm -rf "${libs}"/managesieve.ui/{doc,tests} || die

	# The app sources go last so they win over the common files.
	tar -C "${app}" --exclude=./libs/libManageSieve -cf - . \
		| tar -C "${res}" -xf - || die
}

src_install() {
	local electron="${WORKDIR}/electron"

	# What @electron/packager does: drop the default app, rename the
	# binary, and ship the app unpacked under resources/app.
	rm -f "${electron}"/resources/default_app.asar || die
	mv "${electron}"/electron "${electron}"/sieve || die

	insinto "/${APPDIR}"
	doins -r "${electron}"/.
	insinto "/${APPDIR}/resources/app"
	doins -r "${WORKDIR}"/resources/.

	fperms +x "/${APPDIR}"/{sieve,chrome_crashpad_handler}
	fperms 4711 "/${APPDIR}"/chrome-sandbox
	pax-mark m "${ED}/${APPDIR}"/{sieve,chrome-sandbox,chrome_crashpad_handler}

	dosym "../../${APPDIR}/sieve" "/usr/bin/${PN}"

	newicon -s 64 src/common/icons/linux.png ${PN}.png
	make_desktop_entry "${PN}" "Sieve" "${PN}" "Network;Email;" \
		"StartupWMClass=sieve"

	dodoc README.md CHANGELOG.md
}