#!/usr/bin/bash

# Ublue Rebase Helper 2.0

get_config() {
  REBASE_HELPER_CONFIG_FILE="${REBASE_HELPER_CONFIG_FILE:-/etc/ublue-os/rebase_helper.json}"
  QUERY="$1"
  FALLBACK="$2"
  shift
  shift
  OUTPUT="$(jq -r -c "$QUERY" "$REBASE_HELPER_CONFIG_FILE" 2>/dev/null || echo "$FALLBACK")"
  if [ "$OUTPUT" == "null" ] ; then
    echo "$FALLBACK"
    return
  fi
  echo "$OUTPUT"
}

#shellcheck disable=1091
source /usr/lib/ujust/ujust.sh

IMAGE_INFO="${REBASE_HELPER_INFO_FILE:-/usr/share/ublue-os/image-info.json}"
IMAGE_NAME=$(jq -r '."image-name"' < "$IMAGE_INFO")
IMAGE_VENDOR=$(jq -r '."image-vendor"' < "$IMAGE_INFO")
IMAGE_REGISTRY="ghcr.io/${IMAGE_VENDOR}"

IMAGE_DATE_SEPARATOR="$(get_config '."image-date-separator"' "-")"

# Image variant selection
echo "Select your Bluefin image:"
IMAGE_OPTIONS=(bluefin bluefin-dx cancel)
CHOSEN_IMAGE="$(Choose "${IMAGE_OPTIONS[@]}")"
[[ "$CHOSEN_IMAGE" == "cancel" ]] && exit 0

IMAGE_NAME="$CHOSEN_IMAGE"

# Define base channels
AVAILABLE_TAGS=(lts stream10)

# Channel selection
echo "Which base stream would you like to rebase to?"
CHOSEN_BASE="$(Choose "${AVAILABLE_TAGS[@]}" cancel)"
[[ "$CHOSEN_BASE" == "cancel" ]] && exit 0

# If lts, ask for lts-hwe option
declare -a CHANNELS
if [[ "$CHOSEN_BASE" == "lts" ]]; then
  CHANNELS=(lts lts-hwe)
else
  CHANNELS=(stream10 stream10-hwe)
fi

CHOSEN_TAG="$(Choose "${CHANNELS[@]}" cancel)"
[[ "$CHOSEN_TAG" == "cancel" ]] && exit 0

# Tag selection flow
if [[ "$CHOSEN_TAG" == lts || "$CHOSEN_TAG" == stream10 ]]; then
  echo "Do you want to select a specific tag for channel: $CHOSEN_TAG?"
  fetch_choice=$(Choose "no" "yes" cancel)
  [[ "$fetch_choice" == "cancel" ]] && exit 0

  if [[ "$fetch_choice" == "yes" ]]; then
    echo "Fetching available tags for channel: $CHOSEN_TAG"

    # Fetch all tags
    ALL_TAGS=$(skopeo list-tags "docker://${IMAGE_REGISTRY}/${IMAGE_NAME}" | jq -r '.Tags[]')

    # Build available tag list for selection
    if [[ "$CHOSEN_TAG" == "lts" ]]; then
      mapfile -t valid_tags < <(echo "$ALL_TAGS" | grep -E "^lts$|^lts-amd64$|^lts-arm64$|^lts${IMAGE_DATE_SEPARATOR}[0-9]{8}$")
    elif [[ "$CHOSEN_TAG" == "stream10" ]]; then
      mapfile -t valid_tags < <(echo "$ALL_TAGS" | grep -E "^stream10$|^stream10\\.${IMAGE_DATE_SEPARATOR}?[0-9]{8}$")
    fi

    # Prompt for tag selection
    echo "Select a tag to rebase to:"
    CHOSEN_TAG="$(Choose cancel "${valid_tags[@]}")"
    [[ "$CHOSEN_TAG" == "cancel" ]] && exit 0
  fi
elif [[ "$CHOSEN_TAG" == stream10-hwe ]]; then
  echo "Fetching available tags for channel: $CHOSEN_TAG"

  # Fetch all tags
  ALL_TAGS=$(skopeo list-tags "docker://${IMAGE_REGISTRY}/${IMAGE_NAME}" | jq -r '.Tags[]')

  # Build available tag list for stream10-hwe selection
  mapfile -t valid_tags < <(echo "$ALL_TAGS" | grep -E "^stream10\\.[0-9]{8}-hwe$")

  echo "Select a tag to rebase to:"
  CHOSEN_TAG="$(Choose cancel "${valid_tags[@]}")"
  [[ "$CHOSEN_TAG" == "cancel" ]] && exit 0
fi

REBASE_TARGET="$IMAGE_REGISTRY/$IMAGE_NAME:$CHOSEN_TAG"

echo -e "\nRebase target is: $REBASE_TARGET"
if [[ $(Confirm "Do you really wish to rebase?") -ne "0" ]]; then
    exit 1
fi

rpm-ostree rebase "ostree-image-signed:docker://${REBASE_TARGET}"
exit 0
