#!/usr/bin/env bash
set -euo pipefail

head_ref="${1:-HEAD}"
shift || true
release_refs=("$@")
if [ ${#release_refs[@]} -eq 0 ]; then
  release_refs=(origin/release-0.62)
fi

components=(pd tso scheduler resource-manager router)
files=$(
  {
    for release_ref in "${release_refs[@]}"; do
      git diff --name-only --diff-filter=ACMR "${release_ref}...${head_ref}" -- 'pool/**/Pulumi*.yaml' || true
    done
  } | grep -v '/Pulumi\.dev-' | sort -u
)

if [ -z "$files" ]; then
  echo "No Pulumi YAML differences between ${head_ref} and ${release_refs[*]}."
  exit 0
fi

get_image() {
  local ref="$1"
  local file="$2"
  local component="$3"
  local content base tag tag_key

  if ! content=$(git show "${ref}:${file}" 2>/dev/null); then
    return 1
  fi

  base=$(printf '%s' "$content" | yq -r '.config["eks-freetier:pd-cluster"].pdBaseImage // .config["ack-freetier:pd-cluster"].pdBaseImage // ""')

  case "$component" in
    pd) tag_key="pdServerImageTag" ;;
    tso) tag_key="tsoServerImageTag" ;;
    scheduler) tag_key="scheServerImageTag" ;;
    resource-manager) tag_key="resourceManagerServerImageTag" ;;
    router) tag_key="routerServerImageTag" ;;
    *) echo "unknown component: $component" >&2; exit 2 ;;
  esac

  tag=$(printf '%s' "$content" | yq -r ".config[\"eks-freetier:pd-cluster\"].${tag_key} // .config[\"ack-freetier:pd-cluster\"].${tag_key} // \"\"")

  if [ -z "$base" ] || [ -z "$tag" ]; then
    return 1
  fi

  printf '%s:%s\n' "$base" "$tag"
}

failed=0
index=0
mismatch_lines=()

for release_ref in "${release_refs[@]}"; do
  release_name="${release_ref#origin/}"
  echo "Comparing ${head_ref} against ${release_name}"
  for file in $files; do
    stack=$(basename "$file")
    stack=${stack#Pulumi.}
    stack=${stack%.yaml}
    stack=${stack%.yml}

    for component in "${components[@]}"; do
      head_image=$(get_image "$head_ref" "$file" "$component" || true)
      release_image=$(get_image "$release_ref" "$file" "$component" || true)

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

      if [ "$head_image" != "$release_image" ]; then
        failed=1
        index=$((index + 1))

        line="${index}. stack=${stack}, component=${component}"
        if [ -n "$head_image" ]; then
          line+=", main image=${head_image}"
        fi
        line+=", ${release_name} image=${release_image}"

        mismatch_lines+=("${line}")
      fi
    done
  done
done

if [ "$failed" -ne 0 ]; then
  release_names=()
  for release_ref in "${release_refs[@]}"; do
    release_names+=("${release_ref#origin/}")
  done
  echo "::error title=PD image parity check failed::PD related image parity check failed between ${head_ref} and ${release_names[*]}."
  echo "PD related image parity check failed:"
  printf '%s\n' "${mismatch_lines[@]}"
  exit 1
fi

release_names=()
for release_ref in "${release_refs[@]}"; do
  release_names+=("${release_ref#origin/}")
done

echo "All PD related images match ${release_names[*]}."
