#!/bin/bash
# liber-boot-sd — switch SD extlinux default to label 'sd' (boot from SD)
# Optional: --reboot to reboot immediately
set -euo pipefail

REBOOT=0
[ "${1:-}" = "--reboot" ] && REBOOT=1

CONF_LIVE="/boot/extlinux/extlinux.conf"
CONF_SD_DEV="/dev/mmcblk1p3"
SD_MOUNTPOINT="/mnt/sd-extlinux-tmp"

CONF=""
MOUNTED_BY_US=0

if [ -w "$CONF_LIVE" ] && grep -qE '^label[[:space:]]+sd($|[[:space:]])' "$CONF_LIVE"; then
    CONF="$CONF_LIVE"
elif [ -b "$CONF_SD_DEV" ]; then
    mkdir -p "$SD_MOUNTPOINT"
    mount "$CONF_SD_DEV" "$SD_MOUNTPOINT"
    MOUNTED_BY_US=1
    CONF="$SD_MOUNTPOINT/boot/extlinux/extlinux.conf"
fi

cleanup() {
    if [ "$MOUNTED_BY_US" = "1" ]; then
        sync
        umount "$SD_MOUNTPOINT" 2>/dev/null || true
        rmdir "$SD_MOUNTPOINT" 2>/dev/null || true
    fi
}
trap cleanup EXIT

if [ -z "$CONF" ] || ! grep -qE '^label[[:space:]]+sd($|[[:space:]])' "$CONF"; then
    echo "ERROR: no 'sd' label in extlinux.conf ($CONF)" >&2
    exit 2
fi

# Atomic update: write new file, fsync, replace
TMP=$(mktemp "${CONF}.XXXXXX")
awk 'BEGIN{seen=0} /^default[[:space:]]/ { if(!seen){print "default sd"; seen=1; next} } {print}' "$CONF" > "$TMP"
# If no 'default' line existed, prepend it
if ! grep -qE '^default[[:space:]]' "$TMP"; then
    { echo "default sd"; cat "$TMP"; } > "${TMP}.2"
    mv "${TMP}.2" "$TMP"
fi
chmod --reference="$CONF" "$TMP"
mv "$TMP" "$CONF"
sync

echo "✓ Default boot set to 'sd' in $CONF"
grep -E '^default[[:space:]]' "$CONF"

if [ "$REBOOT" = "1" ]; then
    echo "Rebooting in 5 seconds..."
    sleep 5
    systemctl reboot || reboot
fi
