#!/bin/bash

set -eEuo pipefail

fatal_missing_var() {
  local var_name="$1"
  local var_value="${!var_name}"

  if [[ -z "${var_value}" ]]; then
    echo "Missing mandatory environment variable '\$${var_name}', exiting." >&2
    exit 1
  fi
}

NGCP_VERSION="$(cat /ngcp-fallback/etc/ngcp_version)"
fatal_missing_var NGCP_VERSION

fatal_missing_var TO_PARTITION
BLK_ID="$(blkid "${TO_PARTITION}" -o value | head -1)"
fatal_missing_var BLK_ID

current_lvm='root'
if [[ "${TO_PARTITION}" =~ fallback ]]; then
  current_lvm='fallback'
fi
LVM_ID="$(lvs -o lv_name,lv_uuid | awk "/${current_lvm}/ {print \$2}")"
fatal_missing_var LVM_ID

# shellcheck disable=SC2010
K_VERSION="$(chroot /ngcp-fallback/ linux-version list  | sort -u -r -V | head -1)"
fatal_missing_var K_VERSION

echo "Adding grub target entry to ${NGCP_VERSION}"

file_number=90
file="$(find /ngcp-fallback/etc/grub.d/ -type f -name "${file_number}_*")"
while [[ -n "${file}" ]]; do
  if [[ "${file_number}" -eq 99 ]]; then
    echo "ERROR: Can't find a free number for /ngcp-fallback/etc/grub.d/ file" >&2
    echo "ERROR: There are /ngcp-fallback/etc/grub.d/90..99_ files" >&2
    echo "ERROR: Please check them and free some number" >&2
    exit 1
  fi
  file_number=$(( file_number + 1 ))
  file="$(find /ngcp-fallback/etc/grub.d/ -type f -name "${file_number}_*")"
done

echo "INFO TARGET PARTITION: '${NGCP_VERSION}' '${BLK_ID}' '${LVM_ID}' '${K_VERSION}' '${TO_PARTITION}'"

cp /usr/share/ngcp-upgrade/grub-template /ngcp-fallback/etc/grub.d/"${file_number}"_ngcp_"${NGCP_VERSION}"
sed -ri \
  -e "s|__NGCP_VERSION__|${NGCP_VERSION}|g" \
  -e "s|__BLK_ID__|${BLK_ID}|g" \
  -e "s|__LVM_ID__|${LVM_ID}|g" \
  -e "s|__K_VERSION__|${K_VERSION}|g" \
  -e "s|__NGCP_PARTITION__|${TO_PARTITION}|g" \
  /ngcp-fallback/etc/grub.d/"${file_number}"_ngcp_"${NGCP_VERSION}"
chmod +x /ngcp-fallback/etc/grub.d/"${file_number}"_ngcp_"${NGCP_VERSION}"

sed -ri "s|^GRUB_DEFAULT=.*|GRUB_DEFAULT='NGCP Sipwise ${NGCP_VERSION} ${K_VERSION}'|" /ngcp-fallback/etc/default/grub
