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

# TODO
# Peroper systemd handling
# GUI support

EAPI=8

# awk -F\" '/resolved/ {printf("\t\"%s\"\n",substr($4,28))}' package-lock.json | xclip -i -selection clipboard
NPM_MODULES=(
	"@discoveryjs/json-ext/-/json-ext-0.6.3.tgz"
	"@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz"
	"@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
	"@jridgewell/source-map/-/source-map-0.3.11.tgz"
	"@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz"
	"@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz"
	"@types/eslint/-/eslint-9.6.1.tgz"
	"@types/eslint-scope/-/eslint-scope-3.7.7.tgz"
	"@types/estree/-/estree-1.0.8.tgz"
	"@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz"
	"@types/json-schema/-/json-schema-7.0.15.tgz"
	"@types/katex/-/katex-0.16.8.tgz"
	"@types/linkify-it/-/linkify-it-5.0.0.tgz"
	"@types/markdown-it/-/markdown-it-14.1.2.tgz"
	"@types/mdurl/-/mdurl-2.0.0.tgz"
	"@types/node/-/node-25.6.0.tgz"
	"@types/react/-/react-19.2.14.tgz"
	"@types/react-dom/-/react-dom-19.2.3.tgz"
	"@webassemblyjs/ast/-/ast-1.14.1.tgz"
	"@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz"
	"@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz"
	"@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz"
	"@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz"
	"@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz"
	"@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz"
	"@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz"
	"@webassemblyjs/leb128/-/leb128-1.13.2.tgz"
	"@webassemblyjs/utf8/-/utf8-1.13.2.tgz"
	"@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz"
	"@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz"
	"@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz"
	"@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz"
	"@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz"
	"@webpack-cli/configtest/-/configtest-3.0.1.tgz"
	"@webpack-cli/info/-/info-3.0.1.tgz"
	"@webpack-cli/serve/-/serve-3.0.1.tgz"
	"@xtuc/ieee754/-/ieee754-1.2.0.tgz"
	"@xtuc/long/-/long-4.2.2.tgz"
	"acorn/-/acorn-8.16.0.tgz"
	"acorn-import-phases/-/acorn-import-phases-1.0.4.tgz"
	"ajv/-/ajv-8.18.0.tgz"
	"ajv-formats/-/ajv-formats-2.1.1.tgz"
	"ajv-keywords/-/ajv-keywords-5.1.0.tgz"
	"ansi-regex/-/ansi-regex-5.0.1.tgz"
	"ansi-styles/-/ansi-styles-4.3.0.tgz"
	"argparse/-/argparse-2.0.1.tgz"
	"asynckit/-/asynckit-0.4.0.tgz"
	"axios/-/axios-1.15.0.tgz"
	"baseline-browser-mapping/-/baseline-browser-mapping-2.10.19.tgz"
	"boolbase/-/boolbase-1.0.0.tgz"
	"braces/-/braces-3.0.3.tgz"
	"browserslist/-/browserslist-4.28.2.tgz"
	"buffer-from/-/buffer-from-1.1.2.tgz"
	"call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz"
	"camel-case/-/camel-case-4.1.2.tgz"
	"caniuse-lite/-/caniuse-lite-1.0.30001788.tgz"
	"chalk/-/chalk-4.1.2.tgz"
	"chrome-trace-event/-/chrome-trace-event-1.0.4.tgz"
	"clean-css/-/clean-css-5.3.3.tgz"
	"clone-deep/-/clone-deep-4.0.1.tgz"
	"color-convert/-/color-convert-2.0.1.tgz"
	"color-name/-/color-name-1.1.4.tgz"
	"colorette/-/colorette-2.0.20.tgz"
	"combined-stream/-/combined-stream-1.0.8.tgz"
	"commander/-/commander-8.3.0.tgz"
	"cross-spawn/-/cross-spawn-7.0.6.tgz"
	"css-loader/-/css-loader-7.1.4.tgz"
	"css-select/-/css-select-4.3.0.tgz"
	"css-what/-/css-what-6.2.2.tgz"
	"cssesc/-/cssesc-3.0.0.tgz"
	"csstype/-/csstype-3.2.3.tgz"
	"delayed-stream/-/delayed-stream-1.0.0.tgz"
	"dom-converter/-/dom-converter-0.2.0.tgz"
	"dom-serializer/-/dom-serializer-1.4.1.tgz"
	"entities/-/entities-2.2.0.tgz"
	"domelementtype/-/domelementtype-2.3.0.tgz"
	"domhandler/-/domhandler-4.3.1.tgz"
	"domutils/-/domutils-2.8.0.tgz"
	"dot-case/-/dot-case-3.0.4.tgz"
	"dunder-proto/-/dunder-proto-1.0.1.tgz"
	"electron-to-chromium/-/electron-to-chromium-1.5.340.tgz"
	"enhanced-resolve/-/enhanced-resolve-5.20.1.tgz"
	"entities/-/entities-4.5.0.tgz"
	"envinfo/-/envinfo-7.21.0.tgz"
	"es-define-property/-/es-define-property-1.0.1.tgz"
	"es-errors/-/es-errors-1.3.0.tgz"
	"es-module-lexer/-/es-module-lexer-2.0.0.tgz"
	"es-object-atoms/-/es-object-atoms-1.1.1.tgz"
	"es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz"
	"escalade/-/escalade-3.2.0.tgz"
	"eslint-scope/-/eslint-scope-5.1.1.tgz"
	"esrecurse/-/esrecurse-4.3.0.tgz"
	"estraverse/-/estraverse-5.3.0.tgz"
	"estraverse/-/estraverse-4.3.0.tgz"
	"events/-/events-3.3.0.tgz"
	"fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
	"fast-uri/-/fast-uri-3.1.0.tgz"
	"fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz"
	"fill-range/-/fill-range-7.1.1.tgz"
	"find-up/-/find-up-4.1.0.tgz"
	"flat/-/flat-5.0.2.tgz"
	"follow-redirects/-/follow-redirects-1.16.0.tgz"
	"form-data/-/form-data-4.0.5.tgz"
	"function-bind/-/function-bind-1.1.2.tgz"
	"get-intrinsic/-/get-intrinsic-1.3.0.tgz"
	"get-proto/-/get-proto-1.0.1.tgz"
	"glob-to-regexp/-/glob-to-regexp-0.4.1.tgz"
	"gopd/-/gopd-1.2.0.tgz"
	"graceful-fs/-/graceful-fs-4.2.11.tgz"
	"has-flag/-/has-flag-4.0.0.tgz"
	"has-symbols/-/has-symbols-1.1.0.tgz"
	"has-tostringtag/-/has-tostringtag-1.0.2.tgz"
	"hasown/-/hasown-2.0.2.tgz"
	"he/-/he-1.2.0.tgz"
	"highlight.js/-/highlight.js-11.11.1.tgz"
	"html-minifier-terser/-/html-minifier-terser-6.1.0.tgz"
	"html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz"
	"htmlparser2/-/htmlparser2-6.1.0.tgz"
	"entities/-/entities-2.2.0.tgz"
	"icss-utils/-/icss-utils-5.1.0.tgz"
	"import-local/-/import-local-3.2.0.tgz"
	"interpret/-/interpret-3.1.1.tgz"
	"is-core-module/-/is-core-module-2.16.1.tgz"
	"is-number/-/is-number-7.0.0.tgz"
	"is-plain-object/-/is-plain-object-2.0.4.tgz"
	"isexe/-/isexe-2.0.0.tgz"
	"isobject/-/isobject-3.0.1.tgz"
	"jest-worker/-/jest-worker-27.5.1.tgz"
	"supports-color/-/supports-color-8.1.1.tgz"
	"json-schema-traverse/-/json-schema-traverse-1.0.0.tgz"
	"katex/-/katex-0.16.45.tgz"
	"kind-of/-/kind-of-6.0.3.tgz"
	"linkify-it/-/linkify-it-5.0.0.tgz"
	"loader-runner/-/loader-runner-4.3.1.tgz"
	"locate-path/-/locate-path-5.0.0.tgz"
	"lodash/-/lodash-4.17.23.tgz"
	"lower-case/-/lower-case-2.0.2.tgz"
	"markdown-it/-/markdown-it-14.1.1.tgz"
	"markdown-it-texmath/-/markdown-it-texmath-1.0.0.tgz"
	"math-intrinsics/-/math-intrinsics-1.1.0.tgz"
	"mdurl/-/mdurl-2.0.0.tgz"
	"merge-stream/-/merge-stream-2.0.0.tgz"
	"micromatch/-/micromatch-4.0.8.tgz"
	"mime-db/-/mime-db-1.52.0.tgz"
	"mime-types/-/mime-types-2.1.35.tgz"
	"nanoid/-/nanoid-3.3.11.tgz"
	"neo-async/-/neo-async-2.6.2.tgz"
	"no-case/-/no-case-3.0.4.tgz"
	"node-releases/-/node-releases-2.0.37.tgz"
	"nth-check/-/nth-check-2.1.1.tgz"
	"p-limit/-/p-limit-2.3.0.tgz"
	"p-locate/-/p-locate-4.1.0.tgz"
	"p-try/-/p-try-2.2.0.tgz"
	"param-case/-/param-case-3.0.4.tgz"
	"pascal-case/-/pascal-case-3.1.2.tgz"
	"path-exists/-/path-exists-4.0.0.tgz"
	"path-key/-/path-key-3.1.1.tgz"
	"path-parse/-/path-parse-1.0.7.tgz"
	"picocolors/-/picocolors-1.1.1.tgz"
	"picomatch/-/picomatch-2.3.2.tgz"
	"pkg-dir/-/pkg-dir-4.2.0.tgz"
	"postcss/-/postcss-8.5.10.tgz"
	"postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz"
	"postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz"
	"postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz"
	"postcss-modules-values/-/postcss-modules-values-4.0.0.tgz"
	"postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz"
	"postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
	"pretty-error/-/pretty-error-4.0.0.tgz"
	"proxy-from-env/-/proxy-from-env-2.1.0.tgz"
	"punycode.js/-/punycode.js-2.3.1.tgz"
	"react/-/react-19.2.5.tgz"
	"react-dom/-/react-dom-19.2.5.tgz"
	"rechoir/-/rechoir-0.8.0.tgz"
	"relateurl/-/relateurl-0.2.7.tgz"
	"renderkid/-/renderkid-3.0.0.tgz"
	"require-from-string/-/require-from-string-2.0.2.tgz"
	"resolve/-/resolve-1.22.12.tgz"
	"resolve-cwd/-/resolve-cwd-3.0.0.tgz"
	"resolve-from/-/resolve-from-5.0.0.tgz"
	"scheduler/-/scheduler-0.27.0.tgz"
	"schema-utils/-/schema-utils-4.3.3.tgz"
	"semver/-/semver-7.7.4.tgz"
	"shallow-clone/-/shallow-clone-3.0.1.tgz"
	"shebang-command/-/shebang-command-2.0.0.tgz"
	"shebang-regex/-/shebang-regex-3.0.0.tgz"
	"source-map/-/source-map-0.6.1.tgz"
	"source-map-js/-/source-map-js-1.2.1.tgz"
	"source-map-support/-/source-map-support-0.5.21.tgz"
	"strip-ansi/-/strip-ansi-6.0.1.tgz"
	"style-loader/-/style-loader-4.0.0.tgz"
	"supports-color/-/supports-color-7.2.0.tgz"
	"supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
	"tapable/-/tapable-2.3.2.tgz"
	"terser/-/terser-5.46.1.tgz"
	"terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz"
	"commander/-/commander-2.20.3.tgz"
	"to-regex-range/-/to-regex-range-5.0.1.tgz"
	"ts-loader/-/ts-loader-9.5.7.tgz"
	"source-map/-/source-map-0.7.6.tgz"
	"tslib/-/tslib-2.8.1.tgz"
	"typescript/-/typescript-5.9.3.tgz"
	"uc.micro/-/uc.micro-2.1.0.tgz"
	"undici-types/-/undici-types-7.19.2.tgz"
	"update-browserslist-db/-/update-browserslist-db-1.2.3.tgz"
	"util-deprecate/-/util-deprecate-1.0.2.tgz"
	"utila/-/utila-0.4.0.tgz"
	"watchpack/-/watchpack-2.5.1.tgz"
	"webpack/-/webpack-5.106.2.tgz"
	"webpack-cli/-/webpack-cli-6.0.1.tgz"
	"commander/-/commander-12.1.0.tgz"
	"webpack-merge/-/webpack-merge-6.0.1.tgz"
	"webpack-sources/-/webpack-sources-3.3.4.tgz"
	"mime-db/-/mime-db-1.54.0.tgz"
	"which/-/which-2.0.2.tgz"
	"wildcard/-/wildcard-2.0.1.tgz"
)

inherit cmake

DESCRIPTION="Local AI server: optimized LLM inference on AMD NPU + GPU"
HOMEPAGE="
	https://lemonade-server.ai/
	https://github.com/lemonade-sdk/lemonade
"

SRC_URI="
	https://github.com/lemonade-sdk/${PN}/archive/refs/tags/v${PV}.tar.gz -> ${P}.tar.gz
"
LICENSE="Apache-2.0"
SLOT="0"
KEYWORDS="~amd64"
IUSE="systemd +webapp"
RESTRICT="mirror"

RDEPEND="
	acct-group/lemonade
	acct-user/lemonade
	>=app-arch/zstd-1.5.5
	>=dev-cpp/cpp-httplib-0.26.0
	>=net-libs/libwebsockets-4.3.3
	>=net-libs/mbedtls-3.0
	>=net-misc/curl-8.5.0
	sys-libs/libcap
	systemd? ( sys-apps/systemd:= )
"
DEPEND="${RDEPEND}"
BDEPEND="
	>=dev-cpp/cli11-2.4.2
	>=dev-cpp/nlohmann_json-3.11.3
	x11-libs/libdrm
	virtual/pkgconfig
	webapp? (
		net-libs/nodejs[npm]
	)
"

add_npm_modules() {
	local module=${1}

	SRC_URI+="webapp? (
		$(for module; do
			echo "https://registry.npmjs.org/${module} -> npm-${module%%/*}-${module##*/}"
		done)
	)"
}

add_npm_modules "${NPM_MODULES[@]}"

src_unpack() {
	unpack ${P}.tar.gz || die

	local -a myopts=(
		--audit=false
		--color=false
		--foreground-scripts
		--offline
		--progress=false
		--save=false
		--verbose
    )

	if use webapp; then
		cd "${S}/src/web-app" || die
		sed -e "s|https://registry.npmjs.org/\([^/]*\)/.*/\(.*\)$|file://${DISTDIR}/npm-\1-\2|" \
			-i package-lock.json || die
		npm "${myopts[@]}" install || die
	fi
}

src_prepare() {
	cmake_src_prepare

	if ! use systemd; then
		# Prevent linking against libsystemd (journal support)
		sed -e '/pkg_check_modules(SYSTEMD QUIET libsystemd)/d' \
			-i CMakeLists.txt || die
	fi

	# We have mbedcrypto-3 instead of mbedcrypto
	sed -i \
		-e 's|pkg_check_modules(MBEDCRYPTO QUIET mbedcrypto)|pkg_check_modules(MBEDCRYPTO QUIET mbedcrypto-3)|' \
		src/cpp/cli/CMakeLists.txt || die
}

src_configure() {
	local mycmakeargs=(
		-DBUILD_WEB_APP=$(usex webapp ON OFF)
		-DBUILD_TAURI_APP=OFF
		-DFETCHCONTENT_FULLY_DISCONNECTED=ON
		# Workaround for missing cpp-httplib pkgconfig support
		-DUSE_SYSTEM_HTTPLIB=ON
		-DHTTPLIB_LINK_LIBRARIES=cpp-httplib
	)
	cmake_src_configure
}