# Copyright 2024 JacksonChen666
# Distributed under the terms of the GNU General Public License v2

# TODO: docs without server use flag?

EAPI=8
inherit go-module systemd tmpfiles
# update on every bump
GIT_COMMIT=d11b100

DESCRIPTION="Simple pub-sub notification service"
HOMEPAGE="https://ntfy.sh"
SRC_URI="https://github.com/binwiederhier/ntfy/archive/v${PV}.tar.gz -> ${P}.tar.gz"
# https://wiki.gentoo.org/wiki/Writing_go_Ebuilds#Vendor_tarball
SRC_URI+=" https://files.jacksonchen666.com/gentoo/${P}-vendor.tar.xz"

# packing node_modules for offline builds
#
# NOTE: this is arch specific because esbuild complained about wrong
# architecture in node_modules (packed in amd64, failed on arm64). when
# adding new architecture support, also modify the src_prepare section, and
# test the full build process.
#
# after `npm ci` in ./web/:
# XZ_OPT='-T0 -9' tar -acf ntfy-2.11.0-node_modules-amd64.tar.xz ntfy-2.11.0/web/node_modules/
#
# TODO: build host architecture instead (web build results should be arch
# independent)
SRC_URI+="
	server? (
		amd64? ( https://files.jacksonchen666.com/gentoo/${P}-node_modules-amd64.tar.xz )
		arm64? ( https://files.jacksonchen666.com/gentoo/${P}-node_modules-arm64.tar.xz )
	)
"

# TODO: GPL-2 or later?
LICENSE="|| ( Apache-2.0 GPL-2 )"
# third party deps
#
# for go
# checked on ntfy 2.11.0
# (https://wiki.gentoo.org/wiki/Writing_go_Ebuilds#Licenses)
LICENSE+=" Apache-2.0 MIT BSD BSD-2"

# for node/npm
# checked on ntfy 2.11.0 (npm ci, only packages.json)
#
# find . -name package.json -exec jq -rc --arg filename "{}" \
#     'if has("license") then .license else {"no":$filename} end' "{}" \;
#
# then manually find source of multiple licenses and "no"s. most may be
# subpackages(?) with no license or anything for some reason though
LICENSE+="
	|| ( AFL-2.1 BSD )
	Apache-2.0
	BSD-2
	BSD
	CC0-1.0
	CC-BY-4.0
	ISC
	MIT
	|| ( MIT CC0-1.0 )
	MPL-2.0
	PYTHON
	Unlicense
"
SLOT="0"
KEYWORDS="~amd64 ~arm64"

DEPEND="
	acct-group/ntfy
	acct-user/ntfy
"
RDEPEND="${DEPEND}"
BDEPEND="
	doc? (
		dev-python/mkdocs
		dev-python/mkdocs-material
		dev-python/mkdocs-minify-plugin
	)
	server? (
		net-libs/nodejs[npm]
	)
	${DEPEND}
"
# XXX: default optional server?
IUSE="+server doc"
# TODO: make test succeed
RESTRICT="test"
# disabled due to lack of mirrors
RESTRICT+=" mirror"
# see node_modules SRC_URI for more info
RESTRICT+=" network-sandbox"

pkg_pretend() {
	if use server && ! use doc; then
		ewarn "server USE flag is enabled but doc USE flag isn't, documentation linked on"
		ewarn "the web UI will not be available!"
	fi
}

src_configure() {
	default

	# extracted from goreleaser files
	if use server; then
		# TODO: unbundling?
		GOFLAGS+=" -tags=sqlite_omit_load_extension,osusergo,netgo -ldflags=-linkmode=external -ldflags=-extldflags=-static -ldflags=-s -ldflags=-w"
		CGO_ENABLED=1
	else
		GOFLAGS+=" -tags=noserver"
		CGO_ENABLED=0
	fi
}

src_prepare() {
	default

	# packed `node_modules` is unfortunately arch specific, see NOTE near
	# SRC_URI for `node_modules`
	#if use server && ! ( use amd64 || use arm64 ); then
	if use server; then
		if [ ! -d "web/node_modules/" ]; then
			einfo "A packed node_modules is not available for your architecture. npm ci will be"
			einfo "executed, which will use the network and take a while."
			cd web/
			npm ci
		fi
	fi
}

src_compile() {
	emake cli-deps-static-sites

	# pre-requisites, embedded in binary
	if use server; then
		emake -j1 web-build
	fi
	if use doc; then
		mkdocs build || die
	fi

	# ldflags idea taken from dev-go/golangci-lint::gentoo
	ego build "${myargs[@]}" -ldflags "
		-X main.version=${PV}
		-X main.commit=${GIT_COMMIT}
		-X main.date=$(date -u +%Y-%m-%dT%H:%M:%SZ)"
}

src_install() {
	dobin ntfy

	# https://github.com/binwiederhier/ntfy/blob/9d3fc20e583564e40af5afb90233f4714fdfcb4c/.goreleaser.yml#L82-L100

	# random png
	insinto /usr/share/${PF}/
	cp web/public/static/images/ntfy.png web/public/static/images/logo.png || die
	doins web/public/static/images/logo.png
	chown -R ntfy:ntfy "${D}/usr/share/${PF}/" || die

	# configuration
	insinto /etc/${PN}/
	cp client/client.yml client/client.yml.example || die
	doins client/client.yml.example
	if use server; then
		cp server/server.yml server/server.yml.example || die
		doins server/server.yml.example
	fi

	# referenced folders in example server config
	if use server; then
		dodir /var/lib/${PN}/
		keepdir /var/lib/${PN}/

		# the cache folder
		dotmpfiles "${FILESDIR}/tmpfiles.d/ntfy.conf"
	fi

	# init files
	systemd_dounit client/ntfy-client.service
	doinitd "${FILESDIR}"/init.d/ntfy-client
	doconfd "${FILESDIR}"/conf.d/ntfy-client
	if use server; then
		systemd_dounit server/ntfy.service
		doinitd "${FILESDIR}"/init.d/ntfy
		doconfd "${FILESDIR}"/conf.d/ntfy
	fi

	# docs
	HTML_DOCS="server/docs/" einstalldocs
}

pkg_postinst() {
	chown ntfy:ntfy "/etc/${PN}/" || die
	chmod 0700 "/etc/${PN}/" || die

	if use server; then
		tmpfiles_process ntfy.conf
		chown ntfy:ntfy "/var/lib/${PN}/" || die
		chmod 0700 "/var/lib/${PN}/" || die
	fi
}