#!/bin/sh
set -eu

usage() {
  echo "usage: $0 <provider-manifest> <kubeconfig> <context> <package-image>" >&2
  exit 2
}

[ "$#" -eq 4 ] || usage

manifest=$1
kubeconfig=$2
context=$3
package_image=$4
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
patched=$(mktemp)
cleanup() {
  rm -f "$patched"
}
trap cleanup EXIT

patch=$(python3 - "$package_image" <<'PY'
import json
import sys

print(json.dumps({"spec": {"package": sys.argv[1]}}))
PY
)

KUBECONFIG=/dev/null kubectl patch --local -f "$manifest" \
  --type=merge --patch "$patch" -o yaml >"$patched"

if [ "${CP9_RENDER_ONLY:-false}" = "true" ]; then
  cat "$patched"
  exit 0
fi

KUBECONFIG="$kubeconfig" kubectl --context "$context" \
  apply --server-side --force-conflicts -f "$patched"
KUBECONFIG="$kubeconfig" kubectl --context "$context" \
  wait --for=jsonpath='{.status.currentIdentifier}'="$package_image" --timeout=180s -f "$patched"
KUBECONFIG="$kubeconfig" kubectl --context "$context" \
  wait --for=condition=Installed=True --timeout=180s -f "$patched"
KUBECONFIG="$kubeconfig" kubectl --context "$context" \
  wait --for=condition=Healthy=True --timeout=180s -f "$patched"
revision=$(KUBECONFIG="$kubeconfig" kubectl --context "$context" \
  get -f "$patched" -o jsonpath='{.status.currentRevision}')
[ -n "$revision" ] || {
  echo "provider currentRevision is empty after package convergence" >&2
  exit 1
}
revision_package=$(KUBECONFIG="$kubeconfig" kubectl --context "$context" \
  get providerrevision "$revision" -o jsonpath='{.spec.image}')
[ "$revision_package" = "$package_image" ] || {
  echo "provider revision $revision does not match package $package_image" >&2
  exit 1
}
KUBECONFIG="$kubeconfig" kubectl --context "$context" \
  wait --for=condition=Healthy=True --timeout=180s "providerrevision/$revision"
