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

EAPI=8

PYTHON_COMPAT=( python3_{12..14} )

CHECKREQS_MEMORY="4G"
CHECKREQS_DISK_BUILD="20G"
CHECKREQS_DISK_USR="12G"

inherit check-reqs desktop python-any-r1 udev xdg

DESCRIPTION="Intel(Altera) Quartus Prime Lite FPGA design software"
HOMEPAGE="https://www.altera.com/products/development-tools/quartus"

MAINVER="${PV%.*.*}"
BUILDVER="${PV##*.}"
LITEVER="${MAINVER}std.0.${BUILDVER}"
INTELDIR="/opt/intelFPGA/${MAINVER}"

SRC_URI="Quartus-lite-${LITEVER}-linux.tar"

LICENSE="Intel-FPGA"
SLOT="0"
KEYWORDS="~amd64"
IUSE="+X"
REQUIRED_USE="X"
RESTRICT="fetch strip"

RDEPEND="
	app-arch/bzip2
	dev-libs/expat
	dev-libs/glib
	dev-libs/libxml2
	dev-libs/openssl
	media-libs/alsa-lib
	media-libs/fontconfig
	media-libs/freetype
	media-libs/libpulse
	sys-apps/dbus
	sys-apps/util-linux
	sys-libs/libxcrypt[compat]
	sys-libs/ncurses-compat
	sys-libs/zlib
	x11-libs/libdrm
	x11-libs/libICE
	x11-libs/libSM
	x11-libs/libX11
	x11-libs/libXau
	x11-libs/libXext
	x11-libs/libXi
	x11-libs/libXrender
	x11-libs/libXtst
"
DEPEND="${RDEPEND}"
BDEPEND="
	${PYTHON_DEPS}
	app-arch/unzip
	dev-util/patchelf
"

S="${WORKDIR}"

QA_PREBUILT="${INTELDIR#/}/*"
QA_SONAME="${INTELDIR#/}/*"
QA_FLAGS_IGNORED="${INTELDIR#/}/*"
QA_TEXTRELS="${INTELDIR#/}/*"
QA_EXECSTACK="${INTELDIR#/}/*"
QA_WX_LOAD="${INTELDIR#/}/*"

pkg_nofetch() {
	elog "This package requires manual download due to Intel SSO login."
	elog ""
	elog "1. Go to: https://www.altera.com/products/development-tools/quartus"
	elog "2. Select Quartus Prime Lite Edition ${MAINVER} - Complete Download"
	elog "3. Download: Quartus-lite-${LITEVER}-linux.tar (8.9 GB)"
	elog "   SHA1: 833c96461eb55e0124f358c8ec9322ba1fbd5286"
	elog "4. Place in: ${DISTDIR}"
}

pkg_pretend() {
	check-reqs_pkg_pretend
}

pkg_setup() {
	check-reqs_pkg_setup
	python-any-r1_pkg_setup
}

src_unpack() {
	unpack "Quartus-lite-${LITEVER}-linux.tar"
}

src_install() {
	local extractor="${FILESDIR}/quartus_extractor.py"

	# Extract Quartus base from the .run installer (passive, no execution)
	"${PYTHON}" "${extractor}" \
		"${WORKDIR}/components/QuartusLiteSetup-${LITEVER}-linux.run" \
		--extract "${ED}${INTELDIR}" \
		--component quartus_base || die "Quartus extraction failed"

	# Extract license component
	"${PYTHON}" "${extractor}" \
		"${WORKDIR}/components/QuartusLiteSetup-${LITEVER}-linux.run" \
		--extract "${ED}${INTELDIR}" \
		--component license_component || die "License extraction failed"

	# Device support from .qdz files (plain zip archives)
	local qdz
	for qdz in "${WORKDIR}"/components/*.qdz; do
		[[ -f "${qdz}" ]] || continue
		einfo "Extracting device support: $(basename "${qdz}")"
		unzip -q -o "${qdz}" -d "${ED}${INTELDIR}" || die "Failed to extract $(basename "${qdz}")"
	done

	# Fix permissions - CookFS doesn't store Unix permissions
	chmod -R +x "${ED}${INTELDIR}/quartus/bin" 2>/dev/null
	chmod -R +x "${ED}${INTELDIR}/nios2eds/bin" 2>/dev/null
	chmod -R +x "${ED}${INTELDIR}/niosv/bin" 2>/dev/null

	# Create soname symlinks (official installer does ldconfig)
	ldconfig -n "${ED}${INTELDIR}/quartus/linux64" 2>/dev/null

	# Create unversioned lib symlinks missing from passive extraction
	patchelf --replace-needed liblzma.so.0 liblzma.so.5 \
    	"${ED}${INTELDIR}/quartus/linux64/libboost_iostreams-x64.so.1.70.0"
	for lib in "${ED}${INTELDIR}/quartus/linux64"/lib*.so.*; do
		[[ -f "${lib}" ]] || continue
		base="${lib%%\.so\.*}.so"
		[[ -e "${base}" ]] || ln -sf "$(basename "${lib}")" "${base}"
	done

	# Fix NULL DT_RPATH and insecure RUNPATH
	patchelf --remove-rpath "${ED}${INTELDIR}/quartus/linux64/libgcc_s.so.1" 2>/dev/null
	patchelf --remove-rpath "${ED}${INTELDIR}/quartus/linux64/libgomp.so.1" 2>/dev/null
	patchelf --remove-rpath "${ED}${INTELDIR}/quartus/linux64/libstdc++.so.6" 2>/dev/null
	find "${ED}${INTELDIR}/ip/altera/mentor_vip_ae" -name "*.so" \
		-exec patchelf --remove-rpath {} \; 2>/dev/null

	# Remove Matlab MEX files (useless without Matlab)
	find "${ED}${INTELDIR}" \( -name "*.mexglx" -o -name "*.mexa64" \) -delete

	# Remove broken bundled Perl/Python modules with unresolvable deps
	rm -f "${ED}${INTELDIR}/quartus/linux64/perl/lib/site_perl"/*/x86_64-linux-thread-multi/auto/*/SSLeay/SSLeay.so
	rm -f "${ED}${INTELDIR}/quartus/linux64/perl/lib"/*/x86_64-linux-thread-multi/auto/DB_File/DB_File.so
	rm -f "${ED}${INTELDIR}/quartus/linux64/python/lib/readline"*_failed.so
	rm -f "${ED}${INTELDIR}/quartus/linux64/python/lib/_dbm"*.so

	# Cleanup
	rm -rf "${ED}${INTELDIR}"/{uninstall,logs} 2>/dev/null
	find "${ED}${INTELDIR}" -name unzip -delete 2>/dev/null
	find "${ED}${INTELDIR}" -type d -exec chmod a-s {} + 2>/dev/null
	find "${ED}${INTELDIR}" -perm -o+w -not -type l -exec chmod go-w {} + 2>/dev/null


	find "${ED}${INTELDIR}" -name "*.la" -delete 2>/dev/null

	# Remove unused Qt6 QML plugins with unresolvable deps
	rm -rf "${ED}${INTELDIR}/quartus/linux64/qt6/qml/QtQuick/Timeline"
	rm -rf "${ED}${INTELDIR}/quartus/linux64/qt6/qml/QtQuick/VirtualKeyboard"
	rm -rf "${ED}${INTELDIR}/quartus/linux64/qt6/qml/QtTextToSpeech"
	rm -rf "${ED}${INTELDIR}/quartus/linux64/qt6/qml/QtSensors"
	rm -rf "${ED}${INTELDIR}/quartus/linux64/qt6/qml/QtScxml"
	rm -rf "${ED}${INTELDIR}/quartus/linux64/qt6/qml/QtRemoteObjects"
	rm -rf "${ED}${INTELDIR}/quartus/linux64/qt6/qml/QtOpcUa"
	rm -rf "${ED}${INTELDIR}/quartus/linux64/qt6/qml/QtMultimedia"
	rm -rf "${ED}${INTELDIR}/quartus/linux64/qt6/qml/QtCharts"
	rm -rf "${ED}${INTELDIR}/quartus/linux64/qt6/qml/QtQml/StateMachine"
	rm -rf "${ED}${INTELDIR}/quartus/linux64/qt6/qml/Qt/labs/lottieqt"

	# Fix embedded paths
	sed -i "s,${ED},,g" "${ED}${INTELDIR}/quartus/sopc_builder/.sopc_builder" 2>/dev/null

	# Environment setup
	cat > "${T}/quartus.sh" <<-EOF
		export QUARTUS_ROOTDIR="${INTELDIR}/quartus"
		export PATH="\${PATH}:${INTELDIR}/quartus/bin"
	EOF
	insinto /etc/profile.d
	doins "${T}/quartus.sh"

	# USB Blaster udev rules
	cat > "${T}/51-usbblaster.rules" <<-EOF
		SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", MODE="0666"
	EOF
	udev_newrules "${T}/51-usbblaster.rules" 51-usbblaster.rules

	# Desktop entry
	make_desktop_entry "env QT_QPA_PLATFORM=xcb ${INTELDIR}/quartus/bin/quartus" \
		"Quartus Prime Lite" "${INTELDIR}/quartus/adm/quartusii.png" "Development"

	# License symlink
	dosym "${INTELDIR}/licenses/license.txt" "/usr/share/licenses/${PN}/LICENSE"
}

pkg_postinst() {
	udev_reload
	xdg_desktop_database_update
	xdg_icon_cache_update
	elog "Quartus installed to ${INTELDIR}"
	elog "Run 'source /etc/profile.d/quartus.sh' or re-login to update PATH"
	elog "USB Blaster udev rules installed - reload with: udevadm control --reload-rules"
}

pkg_postrm() {
	udev_reload
	xdg_desktop_database_update
	xdg_icon_cache_update
}