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

EAPI=8

LUA_COMPAT=( lua5-4 )

inherit cmake desktop flag-o-matic lua-single xdg

MY_PN="PrusaSlicer"
MY_PV="$(ver_rs 3 -)"
# Pinned in deps/+prusa_fdm_mixer/prusa_fdm_mixer.cmake
MIXER_COMMIT="09d372aeccb4f7b9a0efbe59d99d70dba196814a"
# Pinned in deps/+Tracy/Tracy.cmake, only the headers are used
TRACY_PV="0.13.1"
# Pinned in deps/+json/json.cmake, needs a fix not in any release yet
JSON_PV="3.12.0"
WX_GTK_VER="3.3-gtk3"

DESCRIPTION="A mesh slicer to generate G-code for fused-filament-fabrication (3D printers)"
HOMEPAGE="https://www.prusa3d.com/prusaslicer/"
SRC_URI="
	https://github.com/prusa3d/PrusaSlicer/archive/refs/tags/version_${MY_PV}.tar.gz -> ${P}.tar.gz
	https://github.com/prusa3d/prusa-fdm-mixer/archive/${MIXER_COMMIT}.tar.gz
		-> prusa-fdm-mixer-${MIXER_COMMIT}.tar.gz
	https://github.com/wolfpld/tracy/archive/refs/tags/v${TRACY_PV}.tar.gz -> tracy-${TRACY_PV}.tar.gz
	https://github.com/nlohmann/json/releases/download/v${JSON_PV}/json.tar.xz
		-> nlohmann-json-${JSON_PV}.tar.xz
"
S="${WORKDIR}/${MY_PN}-version_${MY_PV}"

LICENSE="AGPL-3 Boost-1.0 BSD GPL-2 LGPL-3 MIT"
SLOT="0"
KEYWORDS="~amd64"
IUSE="+webkit"
REQUIRED_USE="${LUA_REQUIRED_USE}"
# The tests need trompeloeil (catch2/trompeloeil.hpp), which is not packaged
RESTRICT="test"

RDEPEND="
	${LUA_DEPS}
	app-arch/libdeflate
	dev-cpp/libassert:=
	dev-cpp/rapidyaml:=
	dev-cpp/tbb:=
	dev-libs/boost:=[nls]
	dev-libs/expat
	dev-libs/glib:2
	dev-libs/gmp:=
	dev-libs/libfmt:=
	dev-libs/mpfr:=
	dev-libs/openssl:=
	dev-libs/pugixml
	dev-libs/spdlog:=
	>=media-gfx/libbgcode-0.0.20260521
	media-gfx/openvdb:=
	media-libs/fontconfig
	media-libs/glew:0=
	media-libs/libjpeg-turbo:=
	media-libs/libpng:0=
	media-libs/nanosvg
	media-libs/qhull:=
	net-misc/curl[adns]
	sci-libs/libigl
	sci-libs/nlopt
	>=sci-libs/opencascade-7.8.0:=
	sci-mathematics/cgal:=
	sys-apps/dbus
	virtual/opengl
	virtual/zlib:=
	x11-libs/gtk+:3
	x11-libs/wxGTK:${WX_GTK_VER}=[X,opengl,webkit?]
	webkit? ( net-libs/webkit-gtk:4.1 )
"
DEPEND="${RDEPEND}
	dev-cpp/cli11
	=dev-cpp/eigen-3*:=
	dev-cpp/expected
	dev-cpp/magic_enum
	dev-cpp/range-v3
	dev-libs/cereal
	dev-libs/yoga
	media-libs/qhull[static-libs]
	$(lua_gen_cond_dep '
		dev-cpp/sol2[${LUA_USEDEP}]
	')
"
BDEPEND="virtual/pkgconfig"

PATCHES=(
	"${FILESDIR}/${PN}-2.8.1-opencascade-7.8.0.patch"
	"${FILESDIR}/${P}-boost-1.87.patch"
	"${FILESDIR}/${P}-cgal-6.0.patch"
	"${FILESDIR}/${P}-nlohmann-json-optional.patch"
	"${FILESDIR}/${P}-system-deps.patch"
	"${FILESDIR}/${P}-wx-3.3.2.patch"
)

src_prepare() {
	# Built as part of bundled_deps, see the system-deps patch
	mkdir bundled_deps/prusa_fdm_mixer || die
	mv "${WORKDIR}/prusa-fdm-mixer-${MIXER_COMMIT}/cpp" \
		bundled_deps/prusa_fdm_mixer/prusa_fdm_mixer || die
	mv "${WORKDIR}/json" bundled_deps/nlohmann_json || die

	sed -i -e 's/PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN/PrusaSlicer-${SLIC3R_VERSION}+Gentoo/g' \
		version.inc || die

	cmake_src_prepare
}

src_configure() {
	# Keep the eclass build type (Release would add -O3 and force LTO), but
	# upstream ships NDEBUG builds: without it debug-only code paths (e.g.
	# the preset bundle cache) and DEBUG_ASSERTs are enabled.
	append-cppflags -DNDEBUG

	local wxconf w
	wxconf="gtk3-unicode-${WX_GTK_VER%%-*}"
	for w in "${CHOST}-${wxconf}" "${wxconf}"; do
		[[ -f ${ESYSROOT}/usr/$(get_libdir)/wx/config/${w} ]] && wxconf=${w} && break
	done || die "Failed to find wxWidgets configuration ${wxconf}"

	local mycmakeargs=(
		# slic3r-app-cli is an untyped add_library() that is installed
		# with a RUNTIME destination only, it has to stay static.
		-DBUILD_SHARED_LIBS=OFF

		-DLUA_INCLUDE_DIR="$(lua_get_include_dir)"
		-DLUA_LIBRARY="$(lua_get_shared_lib)"
		-DTRACY_INCLUDE_DIR="${WORKDIR}/tracy-${TRACY_PV}/public"
		-DwxWidgets_CONFIG_EXECUTABLE="${ESYSROOT}/usr/$(get_libdir)/wx/config/${wxconf}"

		-DSLIC3R_BUILD_TESTS=OFF
		-DSLIC3R_DEBUG_PRESET_CACHE=OFF
		-DSLIC3R_ENABLE_FORMAT_STEP=ON
		-DSLIC3R_ENABLE_PROFILING=OFF
		-DSLIC3R_ENABLE_WEBKIT=$(usex webkit)
		-DSLIC3R_FHS=ON
		-DSLIC3R_GUI=ON
		-DSLIC3R_PCH=OFF
		-DSLIC3R_SENTRY_DSN=
		-DSLIC3R_STATIC=OFF
		-DSLIC3R_YAML=ryml
		-Wno-dev
	)

	cmake_src_configure
}

src_install() {
	cmake_src_install

	# slic3r-app-launcher is the GUI and the CLI in one, as prusa-slicer was
	# in 2.x. The name only matters for upstream's flatpak; it also becomes
	# the WM_CLASS / Wayland app_id, which the desktop file has to match.
	mv "${ED}"/usr/bin/{slic3r-app-launcher,prusa-slicer} || die
	# Static archive of the CLI code linked into the launcher, no headers
	rm "${ED}"/usr/$(get_libdir)/libslic3r-app-cli.a || die

	# Upstream's desktop file carries the prusaslicer:// URL handler needed
	# for the Prusa Account login. Its ID com.prusa3d.PrusaSlicer is also
	# used by the Flathub package, whose export would shadow this one.
	sed -e "s|^Name=.*|Name=PrusaSlicer ${MY_PV}|" \
		-e 's|^Exec=/app/bin/slic3r-app-launcher |Exec=prusa-slicer |' \
		-e 's|^Icon=.*|Icon=prusa-slicer|' \
		"${BUILD_DIR}"/com.prusa3d.PrusaSlicer.desktop > "${T}"/prusa-slicer.desktop || die
	domenu "${T}"/prusa-slicer.desktop

	newicon -s scalable resources/icons/PrusaSlicer.svg prusa-slicer.svg
	newicon -s 128 resources/icons/PrusaSlicer_128px.png prusa-slicer.png
}

pkg_postinst() {
	xdg_pkg_postinst

	elog "This is an alpha release. It keeps its settings in"
	elog "\${XDG_CONFIG_HOME:-~/.config}/PrusaSlicer3-dev, separate from the"
	elog "PrusaSlicer directory used by PrusaSlicer 2.x."
}