#!/bin/bash
ID=rosa
GRUBDIR=/boot/grub2
MNTPOINT=/boot/efi
DEBUG=no
FORCE=no

if [ $1 ] ; then
    DEBUG=yes
    [ $1 == '--force' ] && FORCE='yes'
fi

echo_exit() {
    [ "$DEBUG" != 'no' -o "$2" -ne 0 ] && echo "$1"
    exit $2
}

# continue if EFI
[ -d /sys/firmware/efi ] || echo_exit "/sys/firmware/efi not found. Aborting $0" 0

# set efi boot loader file prefix (PREFIX=x64 -> file bootx64.efi)
# According to UEFI spec, x64 is in small letters, others are in big letters
ARCH=$(arch)
case "$ARCH" in
    'x86_64')  PREFIX=x64 ;;
    'aarch64' | 'arm64') PREFIX=AA64 ;;
    'armhf')   PREFIX=ARM ;;
    'i386'|'i586'|'i686') PREFIX=IA32 ;;
    'riscv64') PREFIX=RISCV64 ;;
    'loongarch64') PREFIX=LOONGARCH64 ;;
    *)  echo_exit "Unknown architecture: $ARCH" ${LINENO} ;;
esac

# continue only if bootloaders installed by Rosa
[ "$(find /boot -name 'rosa-iso-build*')" ] || echo_exit "File rosa-iso-build not found. Aborting $0" 0

# If live OS no need to install bootloader
# anaconda install grub earlier
if losetup |grep -Eq 'LiveOS/rootfs.img|layer-base/0'; then
    echo "Rosa live detected, skip grub2-install"
else
    grub2-install $(df -h /boot | (read; awk '{print $1; exit}'|sed 's/[[:digit:]]*$//'))
fi

# continue if grub
[ -d "$GRUBDIR" ]   || echo_exit "$GRUBDIR not found. Aborting $0" ${LINENO}

pushd $MNTPOINT >/dev/null
EFIDIR="$(ls -1d {EFI,efi,Efi} 2>/dev/null |tail -n1)"
[ "$EFIDIR" ] || EFIDIR="EFI"
mkdir -p ${EFIDIR}
pushd ${EFIDIR} >/dev/null
df -t vfat ./ 2>/dev/null 1>&2 || exit ${LINENO}
[ -d "$ID" ] || echo_exit "${EFIDIR}/$ID not found. Aborting $0" ${LINENO}

BOOTDIR=$(ls -1d {BOOT,boot,Boot} 2>/dev/null |tail -n1)
[ "$BOOTDIR" ] || BOOTDIR='BOOT'
mkdir -p $BOOTDIR
if [ "$FORCE" != 'yes' ] ; then
    # continue if /EFI/BOOT is empty, or if rosa bootloaders in /EFI/BOOT
    [ "$(ls -1 $BOOTDIR)" ] && [ ! -f "$BOOTDIR/${ID}.readme" ] && \
    echo_exit "${EFIDIR}/${BOOTDIR} must be empty or contain Rosa bootloaders. Aborting $0" ${LINENO}
fi


rmdir ${BOOTDIR} 2>/dev/null || (rm -rf ${BOOTDIR}.bak ; mv -f ${BOOTDIR} ${BOOTDIR}.bak)
mkdir -p $BOOTDIR
cp -f ${ID}/{grub${PREFIX}.efi,mm${PREFIX}.efi} ${BOOTDIR}/  2>/dev/null 
if [ -f ${ID}/shim${PREFIX}.efi ] ; then 
    cp -f ${ID}/shim${PREFIX}.efi ${BOOTDIR}/BOOT${PREFIX}.efi
elif [ -f ${ID}/grub${PREFIX}.efi ] ; then
    cp -f ${ID}/grub${PREFIX}.efi ${BOOTDIR}/BOOT${PREFIX}.efi
else
    echo_exit "Efi bootloader not found, need shim${PREFIX}.efi or grub${PREFIX}.efi" ${LINENO}
fi
cat << EOF > "${BOOTDIR}/${ID}.readme"
Rosa efi boot hook. Do not remove this file.
Files in ${EFIDIR}/${BOOTDIR}/  were copied from the ${EFIDIR}/${ID}/
EOF
popd >/dev/null
popd >/dev/null
