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

EAPI=8

inherit check-reqs go-module systemd

MY_PV=${PV/_beta/-beta}
S=${WORKDIR}/${PN}-${MY_PV}

DESCRIPTION="The open-source platform for monitoring and observability"
HOMEPAGE="https://grafana.com"
SRC_URI="
	https://github.com/grafana/grafana/archive/v${MY_PV}.tar.gz -> ${P}.tar.gz
	https://vendors.simple-co.de/${PN}/vendor-${P}.tar.xz
	https://vendors.simple-co.de/${PN}/vendor_yarn-${P}.tar.xz
	https://vendors.simple-co.de/${PN}/yarn-3.2.3.cjs.gz
"
LICENSE="AGPL-3.0 Apache-2.0 BSD-2 BSD-3 BSD-4 BSL-1.0 ImageMagick ISC LGPL-3.0 MIT MPL-2.0 OpenSSL Zlib"
SLOT="8/"${PV}
KEYWORDS="~amd64"
IUSE="systemd"

# needed for webpack (nodejs)
CHECKREQS_MEMORY="8G"

DEPEND="!www-apps/${PN}-bin
	acct-group/${PN}
	acct-user/${PN}
	media-libs/fontconfig
	net-libs/nodejs:0/16[icu]
	sys-apps/yarn
	>=dev-lang/go-1.16
	dev-go/wire"

PN_S="${PN}-${SLOT%/*}"

src_unpack() {
	default
	mv vendor "${S}/vendor"
	mv vendor_yarn "${S}/vendor_yarn"

	## setting latest yarn version (and replace the shipped 3.2.0 cjs)
	mv yarn-3.2.3.cjs "${S}/.yarn/releases/yarn-3.2.0.cjs"
}

src_prepare() {
	sed -i "s:;reporting_enabled = .*:reporting_enabled = false:" \
		conf/sample.ini || die "prepare failed"
	sed -i "s:;check_for_updates = .*:check_for_updates = false:" \
		conf/sample.ini || die "prepare failed"

	mkdir "plugins-bundled/external"

	## offline/cache installation
	echo -e "enableMirror: true\ncacheFolder: ./vendor_yarn" >> .yarnrc.yml

	## preparing files (and replace the version)
	mkdir -p "files"
	cp -a "${FILESDIR}/${PN}".* files || die "coudln't copy needed files!"
	sed -i "s/~PN_S~/${PN_S}/g" files/* || die "couldn't apply slot-patches!"

	default
}

src_compile() {
	addpredict /etc/npm

	## install yarn deps(offline)..
	CYPRESS_INSTALL_BINARY=0 yarn install >/dev/null 2>&1 || die "prepare failed"

	einfo "Wiring everything up.."
	wire gen -tags oss ./pkg/server ./pkg/cmd/grafana-cli/runner || die "wiring failed"
	einfo "Building binaries using go.."
	go run -mod=vendor build.go build || die "compile failed"
	einfo "Building frontend using webpack.."
	# beware, we need at least 8G RAM (@32T)
	export NODE_OPTIONS="--max-old-space-size=8192"
	yarn run build || die "compile failed"
	yarn run plugins:build-bundled || die "compile failed"
}

src_install() {	
	insinto /etc/${PN_S}
	newins conf/sample.ini ${PN}.ini
	newins conf/ldap.toml ldap.toml

	newbin `(find bin -name ${PN}-cli)` ${PN_S}-cli
	newbin `(find bin -name ${PN}-server)` ${PN_S}-server

	insinto "/usr/share/${PN_S}"
	doins -r public conf tools

	newconfd "${S}/files/${PN}.confd" "${PN_S}"
	newinitd "${S}/files/${PN}.initd" "${PN_S}"
	use systemd && systemd_newunit "${S}/files/${PN}.service" "${PN_S}.service"

	keepdir /var/{lib,log}/${PN_S}
	fowners ${PN}:${PN} /var/{lib,log}/${PN_S}
	fperms 0750 /var/{lib,log}/${PN_S}

	keepdir /var/lib/${PN_S}/{dashboards,plugins}
	fowners ${PN}:${PN} /var/lib/${PN_S}/{dashboards,plugins}
	fperms 0750 /var/lib/${PN_S}/{dashboards,plugins}

	keepdir /etc/${PN_S}
	fowners ${PN}:${PN} /etc/${PN_S}/{${PN}.ini,ldap.toml}
	fperms 0640 /etc/${PN_S}/{${PN}.ini,ldap.toml}
}

pkg_postinst() {
	if [ -d /var/lib/${PN} ]; then
		# found non-slotted grafana installation
		ewarn "We found an old ${PN} installation in '/var/lib/${PN}'!"
		ewarn "Make sure to adjust the confs and do a data-migration, the"
		ewarn "new ${PN} data-dir is '/var/lib/${PN_S}'."
	fi

	einfo "${PN} has built-in log rotation. Please see [log.file] section of"
	einfo "/etc/${PN_S}/${PN}.ini for related settings."
	einfo
	einfo "You may add your own custom configuration for app-admin/logrotate if you"
	einfo "wish to use external rotation of logs. In this case, you also need to make"
	einfo "sure the built-in rotation is turned off."
}