# Contributor: lauren n. liberda <lauren@selfisekai.rocks>
# Contributor: Antoine Martin (ayakael) <dev@ayakael.net>
# Maintainer: Antoine Martin (ayakael) <dev@ayakael.net>
pkgname=signal-desktop
pkgver=7.55.0
pkgrel=0
pkgdesc="A messaging app for simple private communication with friends"
url="https://github.com/signalapp/Signal-Desktop/"
# same as electron
arch="aarch64 x86_64"
license="AGPL-3.0-only"
_llvmver=20
depends="
	electron
	font-barlow
	font-eb-garamond
	font-inter
	font-parisienne
	"
makedepends="
	alsa-lib-dev
	aom-dev
	brotli-dev
	bsd-compat-headers
	cargo
	cargo-auditable
	cbindgen
	clang$_llvmver-dev
	cmake
	crc32c-dev
	dav1d-dev
	double-conversion-dev
	electron-dev
	electron-tasje
	ffmpeg-dev
	git-lfs
	glib-dev
	gn
	jsoncpp-dev
	libavif-dev
	libjpeg-turbo-dev
	libepoxy-dev
	libsecret-dev
	libvpx-dev
	libwebp-dev
	libxml2-dev
	lld
	llvm$_llvmver-dev
	mesa-dev
	nodejs
	npm
	pnpm
	openh264-dev
	openssl-dev
	opus-dev
	pipewire-dev
	protoc
	pulseaudio-dev
	py3-setuptools
	python3
	re2-dev
	samurai
	sqlcipher-dev
	vips-dev
	yarn
	"
options="net !check"

# use _check_depends to validate this
_libsignalver=0.71.1
_ringrtcver=2.51.0
_webrtcver=6998b
_sqlcipherver=2.0.1

source="
	https://github.com/signalapp/Signal-Desktop/archive/refs/tags/v$pkgver/Signal-Desktop-$pkgver.tar.gz
	https://github.com/signalapp/libsignal/archive/refs/tags/v$_libsignalver/libsignal-$_libsignalver.tar.gz
	https://github.com/signalapp/ringrtc/archive/refs/tags/v$_ringrtcver/ringrtc-$_ringrtcver.tar.gz
	https://github.com/signalapp/node-sqlcipher/archive/refs/tags/v$_sqlcipherver/node-sqlcipher-$_sqlcipherver.tar.gz
	https://ayakael.net/api/packages/mirrors/generic/webrtc/$_webrtcver/webrtc-$_webrtcver.tar.zst

	libsignal-auditable.patch
	signal-use-system-sqlcipher.patch
	signal-disable-updates.patch
	signal-update-links.patch
	signal-show-window-please.patch
	signal-rollback-locale-changes.patch
	signal-do-not-package-sqlcipher-deps.patch
	ringrtc-webrtc-renamed.patch
	webrtc-shared-libs.patch
	webrtc-compiler.patch
	webrtc-gcc13.patch
	webrtc-rollback-red.patch
	webrtc-rollback-3rdparty-build-gn.patch
	webrtc-pipewire-1.4.patch

	signal-desktop.sh
	"
builddir="$srcdir"

# webrtc broken on clang https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101227
export CC=gcc
export CXX=g++

# required to find the tools
export AR=ar
export NM=nm
export LD=g++

# less log spam, reproducible, allow lto with rust
export CFLAGS="${CFLAGS/-g/} -O2 -Wno-error -Wno-deprecated-builtins -Wno-unknown-warning-option -Wno-builtin-macro-redefined -Wno-deprecated-declarations"
export CXXFLAGS="${CXXFLAGS/-g/} -O2 -Wno-error -Wno-deprecated-builtins -Wno-unknown-warning-option -Wno-builtin-macro-redefined -Wno-deprecated-declarations"
export CPPFLAGS="$CPPFLAGS -D__DATE__=  -D__TIME__=  -D__TIMESTAMP__="

export CARGO_PROFILE_RELEASE_OPT_LEVEL=2
export CARGO_PROFILE_RELEASE_STRIP="symbols"
#export RUSTFLAGS="$RUSTFLAGS -C linker=clang"

export YARN_CACHE_FOLDER="$srcdir/.yarn"

_update_depends() {
	msg "Updating extra dependencies version information in $APKBUILD..."
	# _libsignalver: follow signal-desktop package.json -> @signalapp/libsignal-client
	# _ringrtcver: follow signal-desktop package.json -> @signalapp/ringrtc
	# _webrtcver: follow ringrtc (on version above) -> config/version.properties -> webrtc.version
	#     downloading tarball generated with abuild snapshot (with gclient dependencies fetched)
	# _sqlcipherver: follow signal-desktop package.json -> @signalapp/sqlcipher

	local _libsignalver=$(curl --silent https://raw.githubusercontent.com/signalapp/Signal-Desktop/v$pkgver/package.json | grep "@signalapp/libsignal-client\": \"" | awk '{print $2}' | tr -d ',' | tr -d '"' | head -n 1)
	local _ringrtcver=$(curl --silent https://raw.githubusercontent.com/signalapp/Signal-Desktop/v$pkgver/package.json | grep "@signalapp/ringrtc\": \"" | awk '{print $2}' | tr -d ',' | tr -d '"' | head -n 1)
	local _webrtcver=$(curl --silent https://raw.githubusercontent.com/signalapp/ringrtc/v$_ringrtcver/config/version.properties | awk -F '=' '{if($1 == "webrtc.version"){print $2}}' | head -n 1)
	local _sqlcipherver=$(curl --silent https://raw.githubusercontent.com/signalapp/Signal-Desktop/v$pkgver/package.json | grep "@signalapp/sqlcipher\": \"" | awk '{print $2}' | tr -d ',' | tr -d '"' | head -n 1)

	sed -i \
		-e "s|^_libsignalver=.*|_libsignalver=$_libsignalver|" \
		-e "s|^_ringrtcver=.*|_ringrtcver=$_ringrtcver|" \
		-e "s|^_webrtcver=.*|_webrtcver=$_webrtcver|" \
		-e "s|^_sqlcipherver=.*|_sqlcipherver=$_sqlcipherver|" \
		APKBUILD
}

# webrtc only, the other dependencies are fine with tarballs
_distbucket="sakamoto/lnl-aports-snapshots/"
snapshot() {
	mkdir -p "$srcdir"
	cd "$srcdir"

	# cleanup if retrying
	rm -rf src
	rm -rf webrtc-$_webrtcver
	rm -f webrtc-$_webrtcver.tar
	rm -f webrtc-$_webrtcver.tar.zst

	echo "
solutions = [{
	'name': 'src',
	'url': 'https://github.com/signalapp/webrtc.git@$_webrtcver',
}]
target_cpu = ['x64', 'arm64']
target_cpu_only = True
" > .gclient

	gclient sync --no-history --nohooks --tpot-cipd-ignore-platformed

	# needed DEPS hooks
	python3 'src/build/landmines.py' --landmine-scripts 'src/tools_webrtc/get_landmines.py' --src-dir 'src'
	python3 'src/build/util/lastchange.py' -o 'src/build/util/LASTCHANGE'

	for elf in $(scanelf -RA -F "%F" src); do
		rm -f "$elf"
	done

	mv src webrtc-$_webrtcver

	msg "generating tarball.."
	tar -cf webrtc-$_webrtcver.tar \
		--exclude="ChangeLog*" \
		--exclude="testdata/" \
		--exclude="test_data/" \
		--exclude="android_rust_toolchain/toolchain/" \
		--exclude="base/" \
		--exclude-backups \
		--exclude-caches-all \
		--exclude-vcs \
		webrtc-$_webrtcver

	zstd --auto-threads=logical --ultra --long -22 -T"${ZSTD_LIMIT:-0}" -vv webrtc-$_webrtcver.tar -o "$SRCDEST"/webrtc-$_webrtcver.tar.zst
	mcli cp "$SRCDEST"/webrtc-$_webrtcver.tar.zst "$_distbucket"
}

prepare() {
	# Moves to builddir to use abuild patch logics
	for i in Signal-Desktop-$pkgver libsignal-$_libsignalver ringrtc-$_ringrtcver webrtc-$_webrtcver node-sqlcipher-$_sqlcipherver; do
		mv "$srcdir"/$i "$builddir"/${i%-*}
	done
	default_prepare

	cd "$builddir"/Signal-Desktop

	# puts node modules in the root node_modules instead of under .pnpm
	echo "node-linker=hoisted" >> .npmrc

	msg "Installing signal-desktop JS dependencies"
	pnpm install --ignore-scripts

	# remove shipped fonts for system-provided (part 1)
	rm -rf fonts/

	(
		cd "$builddir"/webrtc

		local use_system="
			brotli
			crc32c
			dav1d
			double-conversion
			ffmpeg
			flatbuffers
			fontconfig
			freetype
			harfbuzz-ng
			highway
			icu
			jsoncpp
			libaom
			libavif
			libdrm
			libjpeg
			libpng
			libsecret
			libvpx
			libwebp
			libxml
			libxslt
			openh264
			opus
			re2
			snappy
			woff2
			zlib
			"
		for _lib in $use_system double_conversion libjpeg_turbo; do
			msg "Removing buildscripts for system provided $_lib"
			find . -type f -path "*{third_party,ringrtc}/$_lib/*" \
				\! -path "*third_party/$_lib/chromium/*" \
				\! -path "*third_party/$_lib/google/*" \
				\! -path './base/third_party/icu/*' \
				\! -path './third_party/libxml/*' \
				\! -path './third_party/re2/*' \
				\! -path './third_party/pdfium/third_party/freetype/include/pstables.h' \
				\! -path './third_party/harfbuzz-ng/utils/hb_scoped.h' \
				\! -path './third_party/crashpad/crashpad/third_party/zlib/zlib_crashpad.h' \
				\! -regex '.*\.\(gn\|gni\|isolate\|py\)' \
				-delete
		done

		msg "Replacing gn files"
		python3 build/linux/unbundle/replace_gn_files.py --system-libraries \
			$use_system

		# zlib depends on base for no reason
		sed -i '/\/\/base/d' ./third_party/zlib/BUILD.gn

		# allow system dependencies in "official builds"
		sed -i 's/OFFICIAL_BUILD/GOOGLE_CHROME_BUILD/' \
			tools/generate_shim_headers/generate_shim_headers.py

		mkdir path
		ln -s /usr/bin/python3 path/vpython3
	)

	(
		cd "$builddir"/ringrtc/src/rust

		msg "Installing ringrtc rust dependencies"
		cargo fetch --target="$CTARGET" --locked
	)

	(
		cd "$builddir"/libsignal

		msg "Installing libsignal rust dependencies"
		cargo fetch --target="$CTARGET" --locked
	)

	(
		cd "$builddir"/node-sqlcipher

		# fix target
		sed -i 's/unknown-linux-gnu/alpine-linux-musl/g' deps/extension/extension.gyp

		msg "Installing sqlcipher js dependencies"
		pnpm install --ignore-scripts
	)

	(
		cd "$builddir"/ringrtc/src/node

		msg "Installing ringrtc js dependencies"
		npm ci --ignore-scripts
	)

	(
		cd "$builddir"/libsignal/node

		# fix target
		sed -i 's/unknown-linux-gnu/alpine-linux-musl/g' binding.gyp

		msg "Installing libsignal js dependencies"
		yarn --ignore-scripts --frozen-lockfile
	)
}

build() {
	chromium_arch="$(node -e 'console.log(process.arch)')"

	# required dependency of ringrtc
	(
		cd "$builddir"/webrtc
		export PATH="$PWD/path:$PATH"

		# shellcheck disable=2089
		local webrtc_args="
			rtc_build_examples=false
			rtc_build_tools=false
			rtc_enable_protobuf=false
			rtc_enable_sctp=false
			rtc_include_tests=false
			rtc_include_ilbc=false
			rtc_libvpx_build_vp9=true
			rtc_use_x11=false

			build_with_mozilla=false
			chrome_pgo_phase=0
			clang_use_chrome_plugins=false
			clang_base_path=\"/usr\"
			custom_toolchain=\"//build/toolchain/linux/unbundle:default\"
			is_cfi=false
			is_clang=false
			is_debug=false
			is_official_build=true
			host_toolchain=\"//build/toolchain/linux/unbundle:default\"
			proprietary_codecs=true
			rtc_link_pipewire=true
			rtc_use_pipewire=true
			symbol_level=0
			use_custom_libcxx=false
			use_lld=true
			use_sysroot=false
		"
		mkdir -p "$builddir"/ringrtc/out/release
		msg "Building signal's webrtc"
		# shellcheck disable=2090,2116
		gn gen "$builddir"/ringrtc/out/release --args="$(echo $webrtc_args)"
		ninja -C "$builddir"/ringrtc/out/release signaldeswebrtc
	)

	(
		cd "$builddir"/ringrtc

		msg "Building libringrtc"
		OUTPUT_DIR="$builddir"/ringrtc/out \
			cargo auditable build --features electron --release -p ringrtc

		mkdir -p src/node/build/linux
		cp -fv out/release/libsignaldeswebrtc.so src/node/build/linux/libsignaldeswebrtc.so
		cp -fv target/release/libringrtc.so src/node/build/linux/libringrtc-$chromium_arch.node
	)

	(
		cd "$builddir"/ringrtc/src/node
		msg "Building ringrtc JS glue code"
		npm run build

		msg "Cleaning dev dependencies for ringrtc"
		npm prune --ignore-scripts --omit=dev
	)

	# module on npm intentionally unbuildable: https://github.com/signalapp/libsignal/issues/464#issuecomment-1160665052
	(
		cd "$builddir"/libsignal/node

		msg "Building libsignal"
		node-gyp configure --nodedir=/usr/include/electron/node_headers --build-from-source
		node-gyp build --nodedir=/usr/include/electron/node_headers --build-from-source

		mkdir -p prebuilds/linux-$chromium_arch
		mv build/Release/libsignal_client_linux_$chromium_arch.node prebuilds/linux-$chromium_arch/node.napi.node

		msg "Building libsignal glue code"
		npm run tsc

		msg "Cleaning dev dependencies for libsignal"
		npm prune -ignore-scripts --omit=dev
	)

	(
		cd "$builddir"/node-sqlcipher

		(
			cd deps/extension
			msg "Building sqlcipher-extension"
			cargo auditable build --release --target $CTARGET
		)

		msg "Building sqlcipher"
		node-gyp configure --nodedir=/usr/include/electron/node_headers --build-from-source
		node-gyp build --nodedir=/usr/include/electron/node_headers --build-from-source

		msg "Building sqlcipher glue code"
		pnpm build

		mkdir -p prebuilds/linux-$chromium_arch
		mv build/Release/obj.target/node_sqlcipher.node prebuilds/linux-$chromium_arch/node.napi.node

		msg "Cleaning dev dependencies for sqlcipher"
		pnpm prune --ignore-scripts --prod
	)

	msg "Building signal-desktop"
	cd "$builddir"/Signal-Desktop

	# from package.json postinstall
	pnpm run build:acknowledgments
	rm -rf node_modules/dtrace-provider

	# get esbuild installed (needed for next step)
	pnpm rebuild esbuild

	# build front
	# resets GIT_CEILING_DIRECTORIES as sometimes abuild sets this and breaks get-expire-time
	NODE_ENV=production \
	SIGNAL_ENV=production \
	NODE_OPTIONS=--openssl-legacy-provider \
	GIT_CEILING_DIRECTORIES= \
	pnpm run build:dev

	# purge non-production deps
	pnpm prune --ignore-scripts --prod

	# use our libsignal
	rm -rf node_modules/@signalapp/libsignal-client/
	cp -r "$builddir"/libsignal/node/ node_modules/@signalapp/libsignal-client

	# use our libringrtc
	rm -rf node_modules/@signalapp/ringrtc/
	cp -r "$builddir"/ringrtc/src/node/ node_modules/@signalapp/ringrtc

	# use our sqlcipher
	rm -rf node_modules/@signalapp/sqlcipher/
	cp -r "$builddir"/node-sqlcipher node_modules/@signalapp/sqlcipher

	SIGNAL_ENV=production \
	tasje pack
}

check() {
	cd "$builddir"/Signal-Desktop
	# tests run against downloaded build of electron for glibc, probably can be patched
	pnpm run test
}

package() {
	cd "$builddir"/Signal-Desktop/tasje_out

	install -Dm644 resources/app.asar "$pkgdir"/usr/lib/$pkgname/app.asar
	cp -r resources/app.asar.unpacked "$pkgdir"/usr/lib/$pkgname/app.asar.unpacked
	install -Dm644 signal.desktop "$pkgdir"/usr/share/applications/$pkgname.desktop

	# this should be in /usr/lib/signal-desktop. however, it does not simply work and I stopped to care
	install -Dm755 "$builddir"/ringrtc/out/release/libsignaldeswebrtc.so "$pkgdir"/usr/lib/libsignaldeswebrtc.so

	install -Dm755 "$srcdir"/signal-desktop.sh "$pkgdir"/usr/bin/signal-desktop

	while read -r size; do
		install -Dm644 icons/$size.png "$pkgdir"/usr/share/icons/hicolor/$size/apps/$pkgname.png
	done < icons/size-list
}

sha512sums="
59e1aae568735976e79ee38d55c87b137f7075063985e72deb42b53af6facd7ed2a8c0912fd86cb88df3182d17c1b58af11bf1501135e6855cfd5ee70270905e  Signal-Desktop-7.55.0.tar.gz
3d1b5b84d42b4f6da46a2f626ec72931d3d7432c10c0d43e562851933f6cf0a434630eb5f8bb9a586d27d6ad5a5d8a6c96873dc468e53bbf6297c35a8da090d8  libsignal-0.71.1.tar.gz
8e32d75f9f8216106b6858d9ab58ad53f209408fc155fe27dec184c8c65c9ab5a3a93e9567953f209424ed435ccc6d4903a49a4edae36eb744a897cc02098312  ringrtc-2.51.0.tar.gz
592987c1661de464a4e6dee3081cb5fd32e5afdacdba43d901557a217e62301b4655009ad5bdc0c1dcff5e8b67d7acd68ac953cd638f31196162aa3ccdd9c63b  node-sqlcipher-2.0.1.tar.gz
ba02cb0c293210f9a683b0e08c6acbe84f5b78089329ec017b0db3493b38ccf39e92c49c2475dc66b5ce3bfe060686718cb5053787e2d61ed320dadb22891989  webrtc-6998b.tar.zst
8d2d2d82c8546c2dd1fef161b61df79918f8c22235a56a46adb375a0beb4acef12c5fe53e67242a4be97f77adc522ff79b47949c352956c742a70d50f4179f7f  libsignal-auditable.patch
7ee747c8aaa9d6e9149fe0a031e3d4cc9e9c08f22c42076bd05e2acb86952f8170032613d13a53716010edfa3f26ad97b530e82460318eb46a42e28cf5faeb9d  signal-use-system-sqlcipher.patch
fc2af28645364cd85c106304a26811b036f6be048c52137fbbcc112870a84132a181f532563e0569b560fde3cf8c02480666a9b01d804b0008f97c728005b1c7  signal-disable-updates.patch
853de84d636f730694f17bcec63463fa7bfbdd0a7f7a64618a8fc6bc523ce1a9854b4c651753735af735c18101295d3efbe54f83ae0bccbed83c8c1fee3e7049  signal-update-links.patch
882d6889b23a3ebc6449c8b6acec8c3853674a7e94f066d65b57bab674ba8c11d582ba2c760825cb67b9202716e6d8b7123001d1e9f9229e49a0b77e9d978265  signal-show-window-please.patch
aca92e4de6cd005d660d7e8b99607de96ca2d7dc220e3465247d517e915e4d41a4b0eb519e85c5eca1c81cd8bac9821acd03ff57f1603918987829c6ea7757b4  signal-rollback-locale-changes.patch
961568777b86f8fbcc73360252123686c9d1e16b2650f23d8afbc6d7580d53024f81b62e9e9cbdcd0031b5cf99854bd47c6dd4580197f2b27b8b4cbb51c6c9c9  signal-do-not-package-sqlcipher-deps.patch
02a648bb8541a39c75fec2db39f024a27976afca41908eefa2fe1f2e30b05b5d59f980ccc930021c0b0c09ba8b0cbcae071e9f0dd530543c667adbc4272af552  ringrtc-webrtc-renamed.patch
98a7e4df27c3ed56c5968ebc3ae8e08bfb54362d0c910f9af1d414079a6d5fe0f18aa570ae3c38042f4691af6a130cb3ff689625e26a3987720dd319a5f587b1  webrtc-shared-libs.patch
897174fa3b1eaa74a3b2d7d861863a9f60550ddb0d7be700cd590600efdc3bd962f52c21e371276eaf8d5657c98fe8ade9853b0197b61a68d5dce6fa03b5899b  webrtc-compiler.patch
3f1095861a79862ab5a55c86d7e353d272974617afba39e4d4441024bede8d7b9b8e122da90d56a9c3c0965171803d6b9e29e91d78167a08c6bcc86b3eedab18  webrtc-gcc13.patch
8f53dcf3264c5cec338f037e57a7770ec939ee06dfb0c5dfeab23967a3a64d3f861a6b5419766ac892676036b4522bce2f47279ca3658b5c0b6a31c82ac05053  webrtc-rollback-red.patch
f8bd574a0de077a643ced26e8a0e3f162e014bbf91c957bbefd113883a70e2b63e483bf400b7e2da8d09edfe76d4f6a257f194a14124f344f1625c5632d12acb  webrtc-rollback-3rdparty-build-gn.patch
7fa0344a144d5b8f05d0962799b8ce1dbe8f2d403a311d4fbf802a2d032e6586a1268387052b529e809c4740a79d6737a63d7e37ea8902ce926b74309dd44fc3  webrtc-pipewire-1.4.patch
87534e7b5ad7365509eab75629e6bd1a9ed61ee92f7e358405a0abaf0df57de14623fb3894eb082f8785422e5c087e1c50f9e2e5cafbb2529591fd7bf447f7f5  signal-desktop.sh
"
