#!/usr/bin/bash
set -Eeuo pipefail

exec 9>/run/nabu-kernel-update.lock
flock -n 9 || exit 0

if [[ -r /sys/firmware/devicetree/base/compatible ]] &&
   ! grep -aq 'xiaomi,nabu' /sys/firmware/devicetree/base/compatible; then
    printf 'This is not a Xiaomi Pad 5 (nabu); skipping the device kernel update.\n'
    exit 0
fi

dnf5 --assumeyes --refresh upgrade senemos-nabu-kernel

latest_kernel="$(find /usr/lib/modules -mindepth 1 -maxdepth 1 -type d \
    -name '*-nabu-senemos-v*' -printf '%f\n' | sort -V | tail -n1)"
[[ -n "$latest_kernel" ]] || {
    printf 'No installed SENEMOS Nabu kernel was found after the DNF transaction.\n' >&2
    exit 1
}

marker=/var/lib/nabu-kernel-update/installed-kernel
entry=/boot/efi/loader/entries/senemos.conf
needs_regeneration=1
if [[ -r "$marker" && "$(<"$marker")" == "$latest_kernel" && -r "$entry" ]]; then
    efi_path="$(sed -nE 's@^efi[[:space:]]+(/.*)@\1@p' "$entry" | head -n1)"
    if [[ -n "$efi_path" && -s "/boot/efi${efi_path}" ]]; then
        needs_regeneration=0
    fi
fi

if (( needs_regeneration )); then
    /usr/bin/nabu-regenerate-uki "$latest_kernel"
fi

efi_path="$(sed -nE 's@^efi[[:space:]]+(/.*)@\1@p' "$entry" | head -n1)"
[[ -n "$efi_path" && -s "/boot/efi${efi_path}" ]] || {
    printf 'The canonical Nabu boot entry does not point to a valid UKI.\n' >&2
    exit 1
}

install -d -m0755 /var/lib/nabu-kernel-update
printf '%s\n' "$latest_kernel" > "$marker"
printf 'Nabu kernel and UKI are current: %s (%s)\n' "$latest_kernel" "$efi_path"
