#!/bin/bash
set -e

usage() {
  echo "Usage: $0 [OPTIONS]"
  echo "  --kernel, -k VERSION  Kernel version (default: current)"
  echo "  --help, -h            Show this help"
  exit 0
}

if [[ "$1" == "--help" || "$1" == "-h" ]]; then
  usage
fi

kernel_version=$(uname -r)

while [[ $# -gt 0 ]]; do
  case $1 in
    --kernel|-k)
      kernel_version="$2"
      shift 2
      ;;
    *)
      echo "Unknown option: $1"
      usage
      ;;
  esac
done

soc_vendor_variant=$(tr '\0' '\n' < /proc/device-tree/compatible | awk -F',' 'NR==1 {v=$1; var=$2} NR==2 {s=$2} END {print s "-" v "-" var}')
current_slot=$(qbootctl -a 2> /dev/null | awk -F':' '{print $2}' | tr -d ' ')

echo "Kernel: ${kernel_version}"
echo "Device: ${soc_vendor_variant}"
echo "Slot: ${current_slot}"

if [ ! -f "/usr/lib/modules/${kernel_version}/Image" ]; then
  echo "ERROR: /usr/lib/modules/${kernel_version}/Image not found"
  exit 1
fi

if [ ! -f "/boot/dtb/qcom/${soc_vendor_variant}.dtb" ]; then
  echo "ERROR: /boot/dtb/qcom/${soc_vendor_variant}.dtb not found"
  exit 1
fi

if [ ! -f "/boot/initrd-${kernel_version}" ]; then
  echo "ERROR: /boot/initrd-${kernel_version} not found"
  exit 1
fi

if ! command -v abootimg &> /dev/null; then
  echo "Installing abootimg..."
  zypper in -y abootimg
fi

echo "Compressing kernel..."
gzip -f -9 -k /usr/lib/modules/${kernel_version}/Image

echo "Combining kernel + dtb..."
cat /usr/lib/modules/${kernel_version}/Image.gz /boot/dtb/qcom/${soc_vendor_variant}.dtb > /tmp/kernel-dtb

echo "Creating boot.img..."
abootimg --create ./openSUSE-Tumbleweed-${soc_vendor_variant}-${kernel_version}.aarch64.boot.img \
    -c kerneladdr=0x8000 \
    -c ramdiskaddr=0x1000000 \
    -c secondaddr=0x0 \
    -c tagsaddr=0x100 \
    -c pagesize=4096 \
    -c cmdline="root=LABEL=ROOT rootdelay=2 mobileroot=LABEL=ROOT loglevel=7 splash=silent console=ttyMSM0,115200 console=tty0 BOOT_IMAGE=/boot/Image luks" \
    -k /tmp/kernel-dtb \
    -r /boot/initrd-${kernel_version}

echo "Flashing to /dev/disk/by-partlabel/boot${current_slot}..."
dd if=openSUSE-Tumbleweed-${soc_vendor_variant}-${kernel_version}.aarch64.boot.img \
    of=/dev/disk/by-partlabel/boot${current_slot}

echo "Done! Reboot to apply."
