#!/bin/sh
#
# EFI boot manager tomfoolery v0.1
# (C) 2025 Pegasus Epsilon <pegasus@pimpninjas.org>
# Distribute Unmodified - https://pegasus.pimpninjas.org/license

OSNAME="Artix Linux"
EFIMOUNT=/EFI
EFIPATH=/EFI/Artix
EFIDISK=/dev/sdc
EFIPART=1
ROOTDEV=/dev/sdc2
KERNEL=$EFIPATH/vmlinuz-linux-zen
UCODE=$EFIPATH/amd-ucode.img
INITRD=$EFIPATH/initramfs-linux-zen.img
CMDLINE="modules=btrfs root=$ROOTDEV rootflags=subvol=artix rw"
CMDLINE="$CMDLINE initrd=$UCODE"
CMDLINE="$CMDLINE initrd=$INITRD"

if [ "$(id -u)" != "0" ]; then
	echo Must be root, sorry.
	exit
fi

if ! [ -f "$EFIMOUNT$KERNEL" ]; then
	echo Kernel $EFIMOUNT$KERNEL not found
	exit
fi

if ! [ -f "$EFIMOUNT$UCODE" ]; then
	echo WARNING: $EFIMOUNT$UCODE not found
	exit
fi

if ! [ -f "$EFIMOUNT$INITRD" ]; then
	echo InitRD $EFIMOUNT$INITRD not found
	exit
fi

case "$1" in
	"boot" | "reboot")
		next=$(efibootmgr | awk -F '[t*]' "BEGIN{IGNORECASE=1}/$2/{print \$2;exit}")
		if [ "$next" ]; then
			efibootmgr -n $next &>/dev/null && \
			if [ "$3" = "now" ]; then
				echo Rebooting into $2 now
				reboot
			else
				echo "Selected $2 (Boot$next) for next boot"
			fi
		else
			echo No boot entry for $2 found
		fi
		;;
	"del" | "remove")
		while : ; do
			current=$(efibootmgr | awk -F '[t*]' "/$OSNAME/{print \$2}")
			if [ "$current" ]; then
				efibootmgr -B -b $current &>/dev/null && \
				echo Successfully removed boot entry for $OSNAME
			else
				echo There is no EFI boot entry for $OSNAME
				break
			fi
		done
		;;
	"add" | "install")
		efibootmgr --create --label "$OSNAME" \
			--disk $EFIDISK --part $EFIPART \
			--loader $KERNEL --unicode "$CMDLINE" --verbose &>/dev/null && \
			echo Successfully added boot entry for $OSNAME
		#efibootmgr --create --label "$OSNAME (Rescue Mode)" \
		#	--disk $EFIDISK --part $EFIPART \
		#	--loader $KERNEL --unicode "init=/bin/sh $CMDLINE" --verbose &>/dev/null && \
		#	echo "Successfully added boot entry for $OSNAME (Rescue Mode)"
		;;
	"reinstall") 
		$0 remove
		$0 install
		;;
	*)
		echo Missing or invalid EFI command
esac

