#!/bin/env sh

set -e

# default var
LIMINE_DEFAULT="/etc/default/limine"
OPT_OUTFILE=""
BUILD_ID=""

if [ -f /etc/os-release ]; then
  . /etc/os-release
fi

if [ -f /etc/limine.conf ]; then
  . /etc/limine.conf
fi

while getopts ":o:b:" opt; do
  case ${opt} in
    o)
      OPT_OUTFILE=${OPTARG}
      ;;
    b)
      BUILD_ID=${OPTARG:-${BUILD_ID}}
      ;;
    ?)
      echo "err: Invalid option: -${OPTARG}" >&2
      exit 1
      ;;
  esac
done

# redirect output
if [ -n "$OPT_OUTFILE" ]; then
  mkdir -p "$(dirname "$OPT_OUTFILE")"
  exec 1> "$OPT_OUTFILE"
fi

# default header
if [ -f "$LIMINE_DEFAULT" ]; then
  cat "$LIMINE_DEFAULT"
fi

# advance options group
render_advgroup() {
  # Args: $1 = pkgbase, $2 = kernelver
  cat <<EOF
/${PRETTY_NAME} ${BUILD_ID} ($1 $2) (Advanced Boot Options)
    comment: Advanced Boot Options for ${PRETTY_NAME} ${BUILD_ID} ($1 $2)
EOF
}

# full menu
render_menu() {
  # Args: $1 = level, $2 = type, $3 = pkgbase, $4 = kernelver
  _level="$1"
  _type="$2"
  _pkgbase="$3"
  _kernelver="$4"

  _menutitle="$_pkgbase $_kernelver"
  _cmdline="$LIMINE_KERNEL_CMDLINE_NORMAL"

  if [ "${LIMINE_BOOTPROTO:-linux}" = "linux" ]; then

    if [ "$_type" = "normal" ]; then
      _menutitle="$_menutitle, normal mode"
    fi

    if [ "$_type" = "recovery" ]; then
      _cmdline="$LIMINE_KERNEL_CMDLINE_RECOVERY"
      _menutitle="$_menutitle, recovery mode"
    fi

    if [ "$_level" = "1" ]; then
      echo "/${PRETTY_NAME} ${BUILD_ID} ($_menutitle)"
    elif [ "$_level" = "2" ]; then
      echo "//${PRETTY_NAME} ${BUILD_ID} ($_menutitle)"
    fi

    cat <<EOF
    comment: ${PRETTY_NAME} ${BUILD_ID} ($_menutitle)
    protocol: linux
    path: boot():/vmlinuz-${_pkgbase}
    cmdline: ${LIMINE_KERNEL_CMDLINE_COMMON} $_cmdline
    module_path: boot():/initramfs-${_pkgbase}.img
EOF
  fi
}

for kernelfile in /usr/lib/modules/*/vmlinuz; do
  if [ ! -f "$kernelfile" ]; then
    continue
  fi

  kerneldir=$(dirname "$kernelfile")
  kernelver=$(basename "$kerneldir")

  pkgbase=$(pacman -Qqo "$kernelfile" 2>/dev/null)

  if [ -z "$pkgbase" ]; then
    continue
  fi

  if [ "$LIMINE_AUTO_COPY_KERNEL" = "1" ]; then
    install -Dm644 "$kernelfile" "/boot/vmlinuz-${pkgbase}"
  fi

  if [ "$LIMINE_AUTO_GEN_INITRD" = "1" ]; then
    if command -v tinyramfs >/dev/null 2>&1; then
       tinyramfs -f -k "$kernelver" "/boot/initramfs-${pkgbase}.img" 1>&2
    else
       echo "warn: tinyramfs not found, skipping initrd generation" >&2
    fi
  fi

  render_menu 1 "" "$pkgbase" "$kernelver"
  render_advgroup "$pkgbase" "$kernelver"
  render_menu 2 "normal" "$pkgbase" "$kernelver"
  render_menu 2 "recovery" "$pkgbase" "$kernelver"
done
