#!/sbin/openrc-run

description="Bee: load NVIDIA kernel modules"

NVIDIA_KO_DIR="/usr/local/lib/nvidia"

depend() {
    need localmount
    before bee-audit
}

start() {
    ebegin "Loading NVIDIA modules"
    einfo "kernel: $(uname -r)"

    if [ ! -d "$NVIDIA_KO_DIR" ]; then
        ewarn "NVIDIA module dir missing: $NVIDIA_KO_DIR"
        eend 1
        return 1
    fi

    einfo "module dir: $NVIDIA_KO_DIR"
    ls "$NVIDIA_KO_DIR"/*.ko 2>/dev/null | sed 's/^/  /' || true

    # Create libnvidia-ml soname symlinks needed by nvidia-smi (glibc binary on Alpine/musl)
    for lib in libnvidia-ml libcuda; do
        versioned=$(ls /usr/lib/${lib}.so.[0-9]* 2>/dev/null | head -1)
        [ -n "$versioned" ] || continue
        base=$(basename "$versioned")
        ln -sf "$base" "/usr/lib/${lib}.so.1" 2>/dev/null || true
        ln -sf "${lib}.so.1" "/usr/lib/${lib}.so" 2>/dev/null || true
    done

    # Load modules via insmod (bypasses modules.dep — modloop squashfs is read-only)
    for mod in nvidia nvidia-modeset nvidia-uvm; do
        ko="$NVIDIA_KO_DIR/${mod}.ko"
        [ -f "$ko" ] || ko="$NVIDIA_KO_DIR/${mod//-/_}.ko"
        if [ -f "$ko" ]; then
            if insmod "$ko" 2>/dev/null; then
                einfo "loaded: $mod"
            else
                ewarn "failed to load: $mod"
                dmesg | tail -n 5 | sed 's/^/  dmesg: /' || true
            fi
        else
            ewarn "not found: $ko"
        fi
    done

    eend 0
}
