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

EAPI=8

inherit cargo check-reqs readme.gentoo-r1 systemd tmpfiles

DESCRIPTION="Unofficial Bitwarden compatible password manager"
HOMEPAGE="https://github.com/dani-garcia/vaultwarden"

if [[ ${PV} == 9999* ]]; then
	inherit git-r3
	EGIT_REPO_URI="https://github.com/dani-garcia/vaultwarden.git"
else
	SRC_URI="
	https://github.com/dani-garcia/vaultwarden/archive/refs/tags/${PV}.tar.gz -> ${P}.tar.gz
	https://github.com/rahilarious/gentoo-distfiles/releases/download/${P}/deps.tar.xz -> ${P}-deps.tar.xz
	https://github.com/rahilarious/gentoo-distfiles/releases/download/${P}/wiki.tar.xz -> ${P}-docs.tar.xz
"
	KEYWORDS="~amd64"
fi

LICENSE="AGPL-3"
# Dependent crate licenses
LICENSE+=" 0BSD Apache-2.0 BSD ISC MIT MPL-2.0 Unicode-3.0"

SLOT="0"
IUSE="cli mysql postgres +sqlite +web"
REQUIRED_USE="|| ( mysql postgres sqlite )"

RDEPEND="
	acct-user/vaultwarden
	acct-group/vaultwarden
	dev-libs/openssl:=
	cli? ( app-admin/bitwarden-cli-bin )
	mysql? ( dev-db/mysql-connector-c:= )
	postgres? ( dev-db/postgresql:* )
	sqlite? ( dev-db/sqlite:3 )
	web? ( www-apps/vaultwarden-web )
"

DEPEND="${RDEPEND}"
BDEPEND="virtual/pkgconfig"

QA_FLAGS_IGNORED="usr/bin/${PN}"
QA_PRESTRIPPED="usr/bin/${PN}"
ECARGO_VENDOR="${WORKDIR}/vendor"

PATCHES=(
	"${FILESDIR}"/vaultwarden-envfile-1.33.2.patch
)

CHECKREQS_MEMORY=3G
CHECKREQS_DISK_BUILD=2G

DOC_CONTENTS="\n
	Configuration file: /etc/${PN}/${PN}.conf\n
	Data directory: /var/lib/${PN}\n
	Log file: /var/log/${PN}.log\n
	Default endpoint: http://127.0.0.1:8000\n
	Admin endpoint: http://127.0.0.1:8000/admin\n
	\n
	MySQL & PostgreSQL users must set DATABASE_URL in config\n
"

pkg_setup() {
	check-reqs_pkg_setup
	rust_pkg_setup
}

src_unpack() {
	if [[ ${PV} == 9999* ]]; then
		# clone vaultwarden
		git-r3_src_unpack

		# clone vaultwarden.wiki
		EGIT_REPO_URI="https://github.com/dani-garcia/vaultwarden.wiki.git"
		EGIT_CHECKOUT_DIR="${WORKDIR}/${PN}.wiki"
		git-r3_src_unpack

		cargo_live_src_unpack
	else
		cargo_src_unpack
	fi
}

src_prepare() {
	default
	if use !web; then
		sed -i \
			-e 's|^# WEB_VAULT_ENABLED=true|WEB_VAULT_ENABLED=false|g;' \
			.env.template || die
	fi

	if use mysql || use postgres; then
		declare -a DB_UNIT
		use mysql && DB_UNIT+=(
				mariadb.service
				mysqld.service
			)
		use postgres && DB_UNIT+=(
				postgresql-{13..17}.service
			)
		cat <<-EOF > "${T}/${PN}-db.conf"
			[Unit]
			After=${DB_UNIT[@]}
			Wants=${DB_UNIT[@]}
		EOF
	fi

}

src_configure() {
	local myfeatures=(
		$(usev sqlite)
		$(usev mysql)
		$(usev postgres postgresql )
	)
	cargo_src_configure
}

src_compile() {
	# https://github.com/dani-garcia/vaultwarden/blob/main/build.rs
	[[ ${PV} != 9999* ]] && export VW_VERSION="${PV}"
	cargo_src_compile
}

src_install() {
	dobin "$(cargo_target_dir)/${PN}"
	systemd_newunit "${FILESDIR}"/vaultwarden-1.33.2.service \
					"${PN}".service
	if [[ -f "${T}/${PN}-db.conf" ]]; then
		local UNIT_DIR="$(systemd_get_systemunitdir)"
		insinto "${UNIT_DIR#${EPREFIX}}/${PN}".service.d
		doins "${T}/${PN}-db.conf"
	fi
	newinitd "${FILESDIR}"/vaultwarden-1.33.2.initd "${PN}"
	newconfd "${FILESDIR}"/vaultwarden-1.33.2.confd "${PN}"
	newtmpfiles "${FILESDIR}"/vaultwarden-tmpfiles-1.33.2.conf "${PN}".conf
	insinto /etc/logrotate.d
	newins "${FILESDIR}/"vaultwarden-1.33.2.logrotated "${PN}"
	insinto /etc/"${PN}"
	newins .env.template "${PN}".conf
	keepdir /var/lib/"${PN}"
	fowners "${PN}":"${PN}" /var/lib/"${PN}"
	fperms 750 /var/lib/"${PN}"

	readme.gentoo_create_doc
	einstalldocs
	dodoc -r ../"${PN}".wiki/*
}

pkg_postinst() {
	tmpfiles_process "${PN}".conf
	readme.gentoo_print_elog

	# delete following after 3 months
	elog "Vaultwarden stack has been moved from ::guru to ::gentoo"
	elog "###  Migration guide: "
	elog "* Backup /etc/vaultwarden.env"
	elog "* Configuration file has been moved from /etc/${PN}.env to /etc/${PN}/${PN}.conf"
	elog "  So make sure to migrate that & remove old config"
}