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

EAPI=8

DISTUTILS_SINGLE_IMPL=1
PYTHON_COMPAT=( python3_{10..13} )
DISTUTILS_USE_PEP517=setuptools

inherit distutils-r1 python-single-r1 systemd

COMMIT="996bc8dbe141d5c233978ef7cc50cb6351498bb9"

DESCRIPTION="An OAI compatible exllamav2 API that's both lightweight and fast."
HOMEPAGE="https://github.com/theroyallab/tabbyAPI"
SRC_URI="https://github.com/theroyallab/tabbyAPI/archive/${COMMIT}.tar.gz -> ${P}.tar.gz"

LICENSE="AGPL-3"
SLOT="0"
KEYWORDS="~amd64"
IUSE="standalone"
REQUIRED_USE="${PYTHON_REQUIRED_USE}"

	# shellcheck disable=SC2016
RDEPEND="${PYTHON_DEPS}
	standalone? (
		acct-group/tabbyapi
		acct-group/video
		acct-user/tabbyapi
	)
	$(python_gen_cond_dep '
		>=dev-python/aiofiles-0[${PYTHON_USEDEP}]
		dev-python/aiohttp[${PYTHON_USEDEP}]
		dev-python/async-lru[${PYTHON_USEDEP}]
		>=dev-python/fastapi-0.115[${PYTHON_USEDEP}]
		>=dev-python/formatron-0.4.11[${PYTHON_USEDEP}]
		>=dev-python/httptools-0.5.0[${PYTHON_USEDEP}]
		>=dev-python/jinja2-3.0.0[${PYTHON_USEDEP}]
		>=dev-python/kbnf-0.4.1[${PYTHON_USEDEP}]
		dev-python/loguru[${PYTHON_USEDEP}]
		dev-python/packaging[${PYTHON_USEDEP}]
		dev-python/pillow[${PYTHON_USEDEP}]
		dev-python/psutil[${PYTHON_USEDEP}]
		dev-python/pydantic[${PYTHON_USEDEP}]
		dev-python/pydantic-settings[${PYTHON_USEDEP}]
		dev-python/rich[${PYTHON_USEDEP}]
		dev-python/ruamel-yaml[${PYTHON_USEDEP}]
		>=dev-python/sse-starlette-2.2.0[${PYTHON_USEDEP}]
		>=dev-python/uvicorn-0.28.1[${PYTHON_USEDEP}]
		dev-python/uvloop[${PYTHON_USEDEP}]
	')
	sci-ml/pytorch[${PYTHON_SINGLE_USEDEP}]
	sci-ml/exllamav2[${PYTHON_SINGLE_USEDEP}]
	sci-ml/exllamav3[${PYTHON_SINGLE_USEDEP}]
	sci-ml/huggingface_hub[${PYTHON_SINGLE_USEDEP}]
	>=sci-ml/tokenizers-0.21.0[${PYTHON_SINGLE_USEDEP}]"
DEPEND="${RDEPEND}"
BDEPEND="${PYTHON_DEPS}"

S="${WORKDIR}/tabbyAPI-${COMMIT}"

PATCHES=(
	"${FILESDIR}/${PN}-reorganize.patch"
	"${FILESDIR}/${PN}-config-path.patch"
	"${FILESDIR}/${PN}-auth-path.patch"
)

DOCS=( README.md config_sample.yml )

src_prepare() {
	mkdir tabbyapi || die
	mv backends common endpoints main.py tabbyapi/ || die
	find tabbyapi -type d -exec touch {}/__init__.py \; || die
	find tabbyapi -name '*.py' -type f -exec sed -i \
		-e 's|^from common |from tabbyapi.common |g' \
		-e 's|^from common\.|from tabbyapi.common.|g' \
		-e 's|^from endpoints\.|from tabbyapi.endpoints.|g' \
		-e 's|^from backends\.|from tabbyapi.backends.|g' \
		-e 's|^import common\b|import tabbyapi.common|g' \
		-e 's|^import endpoints\b|import tabbyapi.endpoints|g' \
		-e 's|^import backends\b|import tabbyapi.backends|g' \
		-e 's|^    from backends\b|    from tabbyapi.backends|g' \
		{} + || die
	distutils-r1_src_prepare
}

src_install() {
	distutils-r1_src_install
	keepdir /var/lib/tabbyapi/loras
	keepdir /var/lib/tabbyapi/models
	insinto /var/lib/tabbyapi
	rm templates/place_your_templates_here.txt || die
	doins -r sampler_overrides templates
	if use standalone; then
		systemd_dounit "${FILESDIR}/${PN}.service"
		newinitd "${FILESDIR}/${PN}.initd" "${PN}"
	fi
}

pkg_postinst() {
	if use standalone; then
		chown -R tabbyapi:tabbyapi /var/lib/tabbyapi || die
	fi
	elog
	elog "Please copy config_sample.yml to /etc/tabbyapi/config.yml and modify it as needed."
	elog
}