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

EAPI=8

PYTHON_COMPAT=( python3_{10..12} )

inherit cmake python-single-r1 readme.gentoo-r1 systemd

GTEST_VER="1.14.0"
GTEST_URL="https://github.com/google/googletest/archive/${GTEST_VER}.tar.gz -> gtest-${GTEST_VER}.tar.gz"
DESCRIPTION="An advanced IRC Bouncer"

if [[ ${PV} == *9999* ]]; then
	inherit git-r3
	EGIT_REPO_URI="https://github.com/znc/znc.git"
else
	MY_PV=${PV/_/-}
	MY_P=${PN}-${MY_PV}
	SRC_URI="
		https://znc.in/releases/archive/${MY_P}.tar.gz
		test? ( ${GTEST_URL} )
	"
	KEYWORDS="amd64 arm arm64 ~ppc64 ~riscv x86"
	S=${WORKDIR}/${MY_P}
fi

HOMEPAGE="https://znc.in"
LICENSE="Apache-2.0"
# "If you upgrade your ZNC version, you must recompile all your modules."
# - https://wiki.znc.in/Compiling_modules
SLOT="0/${PV}"
IUSE="+argon2 +icu nls perl python +ssl sasl tcl test +zlib"
RESTRICT="!test? ( test )"

# tests run znc-buildmod which is a Python script
REQUIRED_USE="
	python? ( ${PYTHON_REQUIRED_USE} icu )
	test? ( ${PYTHON_REQUIRED_USE} )
"

# perl is a build-time dependency of modpython
BDEPEND="
	virtual/pkgconfig
	nls? ( sys-devel/gettext )
	perl? (
		>=dev-lang/swig-4.0.1
		>=dev-lang/perl-5.10
	)
	python? (
		>=dev-lang/swig-4.0.1
		>=dev-lang/perl-5.10
	)
	test? (
		${PYTHON_DEPS}
		dev-qt/qtnetwork:5
	)
"
DEPEND="
	dev-cpp/cctz:=
	argon2? ( app-crypt/argon2:= )
	icu? ( dev-libs/icu:= )
	nls? ( dev-libs/boost:=[nls] )
	perl? ( >=dev-lang/perl-5.10:= )
	python? ( ${PYTHON_DEPS} )
	sasl? ( >=dev-libs/cyrus-sasl-2 )
	ssl? ( dev-libs/openssl:0= )
	tcl? ( dev-lang/tcl:0= )
	zlib? ( sys-libs/zlib:0= )
"
RDEPEND="
	${DEPEND}
	acct-user/znc
	acct-group/znc
"

PATCHES=(
	"${FILESDIR}/${PN}-1.7.1-inttest-dir.patch"
	# The following patch is a backport, it can be removed during the next bump
	"${FILESDIR}/${P}-skip-modperl-modpython-tests-cleaner.patch"
)

pkg_setup() {
	if use python || use test; then
		python-single-r1_pkg_setup
	fi
}

src_prepare() {
	# Let SWIG rebuild modperl/modpython to make user patching easier.
	if [[ ${PV} != *9999* ]]; then
		rm modules/modperl/generated.tar.gz || die
		rm modules/modpython/generated.tar.gz || die
	fi

	sed -i -e "s|DZNC_BIN_DIR:path=|DZNC_BIN_DIR:path=${T}/inttest|" \
		test/CMakeLists.txt || die

	sed -i "s|--datadir=|&${EPREFIX}|" znc.service.in || die

	cmake_src_prepare
}

src_configure() {
	local mycmakeargs=(
		-DWANT_SYSTEMD=yes  # Causes -DSYSTEMD_DIR to be used.
		-DSYSTEMD_DIR="$(systemd_get_systemunitdir)"
		-DWANT_ICU="$(usex icu)"
		-DWANT_ARGON="$(usex argon2)"
		-DWANT_IPV6=yes
		-DWANT_I18N="$(usex nls)"
		-DWANT_PERL="$(usex perl)"
		-DWANT_PYTHON="$(usex python)"
		-DWANT_PYTHON_VERSION="${EPYTHON#python}"
		-DWANT_CYRUS="$(usex sasl)"
		-DWANT_OPENSSL="$(usex ssl)"
		-DWANT_TCL="$(usex tcl)"
		-DWANT_ZLIB="$(usex zlib)"
	)

	if [[ ${PV} != *9999* ]] && use test; then
		export GTEST_ROOT="${WORKDIR}/googletest-${GTEST_VER}/googletest"
		export GMOCK_ROOT="${WORKDIR}/googletest-${GTEST_VER}/googlemock"
	fi

	cmake_src_configure
}

src_test() {
	cmake_build unittest
	DESTDIR="${T}/inttest" cmake_build install
	local filter='-'
	if ! use perl; then
		filter="${filter}:ZNCTest.Modperl*"
	fi
	if ! use python; then
		filter="${filter}:ZNCTest.Modpython*"
	fi
	# CMAKE_PREFIX_PATH and CXXFLAGS are needed for znc-buildmod
	# invocations from inside the test
	GTEST_FILTER="${filter}" ZNC_UNUSUAL_ROOT="${T}/inttest" \
		CMAKE_PREFIX_PATH="${T}/inttest/usr/share/znc/cmake" \
		CXXFLAGS="${CXXFLAGS} -isystem ${T}/inttest/usr/include" \
		cmake_build inttest
}

src_install() {
	cmake_src_install

	dodoc NOTICE
	newinitd "${FILESDIR}"/znc.initd-r2 znc
	newconfd "${FILESDIR}"/znc.confd-r1 znc

	local DOC_CONTENTS
	# "local" has its own return value which is not what we want to catch
	DOC_CONTENTS=$(<"${FILESDIR}/README.gentoo-r1") || die
	local DISABLE_AUTOFORMATTING=1
	readme.gentoo_create_doc
}

pkg_postinst() {
	if [[ -d "${EROOT}/var/lib/znc/.znc/" ]]; then
		eerror "${EROOT}/var/lib/znc/.znc/ exists, please move your data to ${EROOT}/var/lib/znc/"
		eerror ""
		eerror "The systemd unit has changed and now expects data to be located"
		eerror "at the root of ${EROOT}/var/lib/znc instead of its '.znc' subfolder."
		eerror "The recommended procedure to move the data is the following:"
		eerror "1. stop the service: systemctl stop znc.service"
		eerror "2. move the data: cp -a '${EROOT}/var/lib/znc/.znc/.' '${EROOT}/var/lib/znc/'"
		eerror "3. fix the config file: sed -i 's|${EROOT}/var/lib/znc/.znc|${EROOT}/var/lib/znc|g' '${EROOT}/var/lib/znc/configs/znc.conf'"
		eerror "4. restart znc: systemctl start znc.service"
		eerror "5. once everything works, remove the old data directory: rm -r '${EROOT}/var/lib/znc/.znc/'"
		eerror "See https://bugs.gentoo.org/743856 for details."
	fi

	if [[ -z "${REPLACING_VERSIONS}" ]]; then
		# This is a new installation
		readme.gentoo_print_elog
	fi
}

pkg_config() {
	if [[ -d "${EROOT}/var/lib/znc/configs" ]]; then
		ewarn "${EROOT}/var/lib/znc/configs/ already exists,"
		ewarn "aborting to avoid damaging any existing configuration."
		ewarn "If you are sure you want to generate a new configuration,"
		ewarn "remove the folder and try again."
	else
		einfo "Press enter to interactively create a new configuration file for znc."
		einfo "To abort, press Control-C"
		read
		su ${PN} -p -s /bin/sh -c 'ZNC_NO_LAUNCH_AFTER_MAKECONF=1 \
			"${EROOT}"/usr/bin/znc --makeconf \
			--datadir "${EROOT}/var/lib/znc"' || die "Config failed"
		einfo
		einfo "You can now start the znc service using the init system of your choice."
		einfo "Don't forget to enable it if you want to use znc at boot."
	fi
}