#!/usr/bin/env bash

set -euo pipefail

UMBREL_ROOT="$(readlink -f $(dirname "${BASH_SOURCE[0]}")/../../..)"
SD_MOUNT_POINT="/sd-root"
SD_UMBREL_ROOT="${SD_MOUNT_POINT}${UMBREL_ROOT}"

set_status="/status-server/set-status"

check_root () {
  if [[ $UID != 0 ]]; then
    echo "This script must be run as root"
    exit 1
  fi
}

check_dependencies () {
  for cmd in "$@"; do
    if ! command -v $cmd >/dev/null 2>&1; then
      echo "This script requires \"${cmd}\" to be installed"
      exit 1
    fi
  done
}

check_semver_range () {
  local range="${1}"
  local version="${2}"
  "${UMBREL_ROOT}/scripts/umbrel-os/semver" -r "${range}" "${version}" | grep --quiet "^${version}$"
}

main () {
  check_root
  check_dependencies jq
  $set_status sdcard-update started
  echo "Checking if SD card Umbrel is newer than external storage..."
  local external_version=$(cat "${UMBREL_ROOT}/info.json" | jq -r .version | cut -d "-" -f "1")
  local sd_version=$(cat "${SD_UMBREL_ROOT}/info.json" | jq -r .version | cut -d "-" -f "1")

  if ! check_semver_range ">${external_version}" "${sd_version}"; then
    echo "No, SD version is not newer, exiting."
    $set_status sdcard-update completed
    exit 0
  fi

  echo "Yes, SD version is newer."
  # This will fail if we ever have multiple ranges with pre-release tags.
  # e.g `1.2.3-beta <2.0.0` will become `1.2.3` due to striping the `-`
  local update_requirement=$(cat "${SD_UMBREL_ROOT}/info.json" | jq -r .requires | cut -d "-" -f "1")

  echo "Checking if the external storage version \"${external_version}\" satisfies update requirement \"${update_requirement}\"..."
  if ! check_semver_range "${update_requirement}" "${external_version}"; then
    echo "No, we can't do an automatic update, exiting."
    $set_status sdcard-update errored semver-mismatch
    exit 0
  fi

  # As the system just booted, there cannot be an update in progress...
  # We'll delete the update lock (update-in-progress)
  # to avoid the update (from the SD card) aborting
  rm --force "${UMBREL_ROOT}/statuses/update-in-progress" || true

  echo "Yes, it does, attempting an automatic update..."
  "${UMBREL_ROOT}/scripts/update/update" --path "${SD_UMBREL_ROOT}"
  $set_status sdcard-update completed
}

main
