#!/usr/bin/env bash
# Handles cleanup of Limine boot entries when kernels are removed or upgraded

set -euo pipefail

# Import functions and environment variables
LIMINE_FUNCTIONS_PATH=/usr/lib/limine/limine-common-functions
# File for recording kernels marked for later Limine boot entry removal,
# this file persists in case of an kernel upgrade failure or power outage
REMOVE_LIST="/var/lib/limine/removed_kernels.list"

# Record kernels marked for removal before pacman upgrade,
# ensuring boot entries are preserved if the upgrade fails.
pre_remove() {
	# Ensure directory exists
	install -d -m 755 /var/lib/limine

	# Read stdin from the libalpm hook
	while read -r targetLine; do
		# Match only pkgbase files in /usr/lib/modules/*/pkgbase
		if [[ "$targetLine" == */pkgbase ]]; then
			if [[ -f "$targetLine" ]]; then
				kernelName="$(<"$targetLine")"
				# Append to remove list
				echo "$kernelName" >>"$REMOVE_LIST"
			fi
		fi
	done
}

# After pacman upgrade, remove boot entries of kernels that no longer exist in /usr/lib/modules.
post_remove() {
	# No record file -> nothing to do
	[[ -f "$REMOVE_LIST" ]] || return 0

	# Load common Limine functions
	# shellcheck disable=SC1090
	source "$LIMINE_FUNCTIONS_PATH" || {
		echo "Error: Failed to source $LIMINE_FUNCTIONS_PATH" >&2
		return 1
	}

	initialize_header || return 1
	mutex_lock "limine-dracut-remove"

	valid_kernels=$(pacman -Qqo /usr/lib/modules/*/pkgbase 2>/dev/null || true)
	while read -r kernelName; do
		# Remove spaces (invalid for kernel file/directory name in FAT32)
		kernelNameClean="${kernelName// /}"

		# Skip empty lines
		[[ -z "${kernelNameClean}" ]] && continue

		# If kernel no longer exists in pacman-owned /usr/lib/modules/*/pkgbase
		if ! grep -qx "$kernelName" <<<"$valid_kernels"; then
			echo "Removed unused Limine boot entry: ${kernelName}"
			# Safely remove boot entries of the kernel
			limine-entry-tool --remove-all "${kernelNameClean}" "${kernelNameClean}-fallback" --quiet --no-mutex
		fi
	done <"$REMOVE_LIST"

	enroll_config
	mutex_unlock

	# Cleanup
	rm -f "$REMOVE_LIST"
}

case "$1" in
pre) pre_remove ;;
post) post_remove ;;
*)
	echo "Usage: $0 {pre|post}" >&2
	exit 1
	;;
esac
