#!/bin/sh -e
# deps: sh curl

ROOT="${ROOT:-}"
SERVER="${SERVER:-https://repo.achill.org/mr}"
ARCH="${ARCH:-$(cat $ROOT/etc/apk/arch 2>/dev/null || uname -m)}"
PROJECT="${PROJECT:-aports}"

err() {
	printf "\033[1;31m>>>\033[1;0m %s\n" "$1" 1>&2
}

fail() {
	err "$@"
	exit 1
}

msg() {
	printf "\033[1;32m>>>\033[1;0m %s\n" "$1" 1>&2
}

msg2() {
	printf "    %s\n" "$1" 1>&2
}

mrurl() {
	local _project="$1" _mrid="$2"
	case "$_project" in
		aports) echo "https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/$_mrid" ;;
		pmaports) echo "https://gitlab.postmarketos.org/postmarketOS/pmaports/-/merge_requests/$_mrid" ;;
	esac
}

is_added() {
	local _mrid="$1" _project="$2"
	[ -f "$ROOT/etc/apk/repositories.d/$_project-$_mrid.list" ] && return 0
}

get_key_file() {
	local _mrid="$1" _project="$2"
	is_added $_mrid $_project || fail "$1 ($2) doesn't exist"
	echo "$(cat "$ROOT"/etc/apk/repositories.d/$2-$1.list | grep "^# /etc/apk/keys" | cut -c3-)"
}

must_rm() {
	[ -f "$1" ] && rm -f $1 || fail "$1 doesnt exist"
}

is_pmos() {
	local _id=$(cat "$ROOT"/etc/os-release | grep ^ID= | sed 's/"//g' | cut -d= -f2)

	case "$_id" in
		postmarketos) return 0;;
		alpine) return 1;;
		*) fail "Not pmOS or Alpine";;
	esac
}

is_edge() {
	local _ver=$(cat "$ROOT"/etc/os-release | grep ^VERSION_ID= | sed 's/"//g' | cut -d= -f2)

	case "$_ver" in
		edge|*_alpha*) return 0;; # pmos uses edge, alpine uses 3.24.0_alpha20251224
		*) return 1;;
	esac
}

add() {
	local _mrid="$1"
	[ "$_mrid" == "" ] && fail "No Merge-Request ID passed as argument"
	is_added $_mrid $PROJECT && fail "Already installed"

	if [ "$PROJECT" = pmaports ]; then is_pmos || fail "You can't test pmaports on Alpine"; fi
	is_edge || fail "Non-edge is not supported yet" # TODO: we must only install repos if MR target branch matches distro ver	

	msg "Downloading repository signing key.."
	msg2 "This may take a while.. (Proxy server is downloading the repositories into cache)"
	local _keysdir="$(mktemp -d)"; mkdir -p "$_keysdir"
	if ! (cd "$_keysdir"; curl -L --fail --remote-header-name -O $SERVER/$PROJECT/$_mrid/meta/$ARCH/key.rsa.pub); then
		rm "$_keysdir/*" 2>&1 >/dev/null ||:
		err "Failed to download key. :("
		msg2 "It may be due to the following issues"
		msg2 "1. You're unable to connect to $SERVER."
		msg2 "2. You don't have permissions to write to $_keysdir."
		msg2 "3. The MR artifacts have expired. Please re-try the job pipeline."
		msg2 "4. The MR CI is still building. Please wait."
		exit 1
	fi
	mkdir -p "$ROOT/etc/apk/keys"

	local _keyname=$(basename $(ls "$_keysdir"/*))
	mv "$_keysdir"/* "$ROOT"/etc/apk/keys/

	msg "Adding repositories of <$(mrurl $PROJECT $_mrid)>.."
	mkdir -p "$ROOT"/etc/apk/repositories.d/
	local _list="$ROOT/etc/apk/repositories.d/$PROJECT-$_mrid.list"
	echo "# /etc/apk/keys/$_keyname" > "$_list"

	if [[ "$PROJECT" = "aports" ]]; then
		for i in main community testing; do
			msg2 "Verify existance of $i repository"
			if curl -s -o /dev/null -L --fail -I $SERVER/$PROJECT/$_mrid/$i/$ARCH/APKINDEX.tar.gz; then
				echo "$SERVER/$PROJECT/$_mrid/$i" >> "$_list"
			fi
		done
	elif [[ "$PROJECT" = "pmaports" ]] && is_pmos; then
		msg2 "Verify existance of main repository"
		if curl -s -o /dev/null -L --fail -I $SERVER/$PROJECT/$_mrid/edge/$ARCH/APKINDEX.tar.gz; then
			echo "$SERVER/$PROJECT/$_mrid/edge" >> "$_list"
		fi

		if cat "$ROOT"/etc/apk/repositories | grep extra-repos/systemd >/dev/null; then
			msg2 "Verify existance of systemd repository"
			if curl -s -o /dev/null -L --fail -I $SERVER/$PROJECT/$_mrid/systemd-edge/$ARCH/APKINDEX.tar.gz; then
				echo "$SERVER/$PROJECT/$_mrid/systemd-edge" >> "$_list"
			fi
		fi
	fi

	msg "Done. Please run \`apk upgrade -Ua\` to apply changes."
}

zap() {
	local _mrid="$1"
	[ "$_mrid" == "" ] && fail "No Merge-Request ID passed as argument (or use --all)"

	if [ "$_mrid" == "--all" ]; then
		for _list in "$ROOT"/etc/apk/repositories.d/*-*.list; do
			[ -e "$_list" ] || continue
			local _base="${_list##*/}"; _base="${_base%.list}"
			local _proj="${_base%-*}" _id="${_base##*-}"
			PROJECT=$_proj _noupgrademsg=1 zap "$_id"
		done
	else
		is_added $_mrid $PROJECT || fail "Not installed"
		msg "Removing repository of <$(mrurl $PROJECT $_mrid)>.."
		must_rm "$ROOT"/$(get_key_file $_mrid $PROJECT)
		must_rm "$ROOT"/etc/apk/repositories.d/$PROJECT-$_mrid.list
	fi

	[ "$_noupgrademsg" = 1 ] || msg "Done. Please run \`apk upgrade -Ua\` to apply changes."
}

info() {
	echo "Installed merge-requests:"
	# TODO: warn about MRs already merged

	ls $ROOT/etc/apk/repositories.d/*-*.list 2>/dev/null | while read line; do
		local _base="${line##*/}"; _base="${_base%.list}"
		local _proj="${_base%-*}" _mrid="${_base##*-}"
		echo "- <$(mrurl $_proj $_mrid)>"
	done
}

case "$1" in
	-p) shift; PROJECT=pmaports ;;
	-a) shift; PROJECT=aports ;;
esac

case "$1" in
	add) shift; add $@ ;;
	zap) shift; zap $@ ;;
	info|post-commit) info ;;
	pre-commit) : ;;
	*) fail "usage: $0 [-p|-a] {add,zap,info} <MRID>";
esac
