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

EAPI=8

inherit desktop flag-o-matic toolchain-funcs xdg-utils

DESCRIPTION="Compare, merge files and folders using simple, powerful commands"
HOMEPAGE="https://www.scootersoftware.com"
SRC_URI="
	https://www.scootersoftware.com/${P}.x86_64.tar.gz
	https://downloads.sourceforge.net/sevenzip/7-Zip/26.00/7z2600-src.tar.xz
"

LICENSE="Bcompare"
SLOT="0"
KEYWORDS="amd64"
IUSE="kde"
QA_PREBUILT="usr/lib/beyondcompare/* usr/lib*/qt6/plugins/kf6/kfileitemaction/bcompare_ext_kde6.so"

RESTRICT="bindist mirror strip"
RDEPEND="
	app-arch/7zip
	app-arch/bzip2
	app-arch/unrar
	dev-libs/libqt6pas
	dev-qt/qtbase:6[gui,widgets]
	sys-apps/dbus
	virtual/zlib
	x11-libs/libX11
	x11-libs/libxkbcommon
"
BDEPEND="
	app-arch/xz-utils[extra-filters(+)]
"

src_unpack() {
	unpack ${P}.x86_64.tar.gz
	unpack 7z2600-src.tar.xz
}

src_compile() {
	# Remove -Werror to avoid build failures from harmless warnings
	sed -i 's/-Werror //g' "${WORKDIR}/CPP/7zip/7zip_gcc.mak" || die

	pushd "${WORKDIR}/CPP/7zip/Bundles/Format7zF" > /dev/null || die
	emake -f makefile.gcc \
		CC="$(tc-getCC)" \
		CXX="$(tc-getCXX)"
	popd > /dev/null || die
}

src_install() {
	local BC_LIB="/usr/lib/beyondcompare"
	local BC_BIN="/usr/bin"

	# Install lib7z.so built from 7-zip source
	exeinto "${BC_LIB}"
	newexe "${WORKDIR}/CPP/7zip/Bundles/Format7zF/_o/7z.so" lib7z.so

	# BCompare binary
	doexe BCompare

	insinto "${BC_LIB}"
	doins BCompare.mad libcloudstorage.so.22.0

	# bzip2 compatibility
	dosym ../../$(get_libdir)/libbz2.so.1 "${BC_LIB}/libbz2.so.1.0"

	# KDE 6 Context Menu Plugin (Optional)
	if use kde; then
		local KDE6_PLUGINS="/usr/$(get_libdir)/qt6/plugins/kf6/kfileitemaction"
		exeinto "${KDE6_PLUGINS}"
		newexe "ext/bcompare_ext_kde6.amd64.so" "bcompare_ext_kde6.so"
	fi

	# Wrapper Script
	dodir "${BC_BIN}"
	cat <<-EOF >"${ED}${BC_BIN}/bcompare" || die
	#!/bin/sh
	# Force X11 backend for stability
	export QT_QPA_PLATFORM=xcb

	# Suppress Qt noise (QComboBox warnings, etc.)
	export QT_LOGGING_RULES="qt.core.qobject.connect.warning=false;*.debug=false"

	# Use basic dialogs to prevent crashes on high-end desktop environments
	export QT_NO_NATIVE_FILE_DIALOGS=1

	# Prioritize our minimal lib dir
	export LD_LIBRARY_PATH="${BC_LIB}:\${LD_LIBRARY_PATH}"

	# Execute and redirect stderr to silence QThreadStorage cleanup messages
	exec "${BC_LIB}/BCompare" "\$@" 2>/dev/null
	EOF
	fperms +x "${BC_BIN}/bcompare"

	# Integration Files
	domenu bcompare.desktop
	doicon bcompare.png
	insinto /usr/share/mime/packages
	doins bcompare.xml

	insinto /usr/share/pixmaps
	doins bcomparefull32.png bcomparehalf32.png

	dodoc -r help/*

	# revdep-rebuild mask
	insinto /etc/revdep-rebuild
	echo "SEARCH_DIRS_MASK=\"${BC_LIB}\"" > "${T}/20${PN}"
	doins "${T}/20${PN}"
}

pkg_postinst() {
	xdg_desktop_database_update
	xdg_mimeinfo_database_update
}

pkg_postrm() {
	xdg_desktop_database_update
	xdg_mimeinfo_database_update
}