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

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel)"
source "$REPO_ROOT/deployments/lib/lib.sh"

EXPECTED_CLUSTER_ARN="${EXPECTED_CLUSTER_ARN:-arn:aws:eks:us-west-2:227896186585:cluster/o11y-dev-us-west-2-byoc-0303}"

if ! declare -f get_helmrelease >/dev/null; then
  get_helmrelease() {
    local server_url="$1"
    local name="$2"
    local region_id="${O11Y_OPS_API_REGION_ID:-aws-us-west-2}"
    local logical_region="${O11Y_OPS_API_LOGICAL_REGION:-us-west-2-byoc-0303}"
    local headers_json

    if [[ -z "${OPS_API_ACCESS_TOKEN:-}" && -n "${O11Y_OPS_API_TOKEN:-}" ]]; then
      OPS_API_ACCESS_TOKEN="$O11Y_OPS_API_TOKEN"
    fi

    mint_ops_api_token >/dev/null
    headers_json="$(build_ops_api_headers "$OPS_API_ACCESS_TOKEN" "$region_id" "$logical_region")"
    ops_api_request GET "$server_url" "helmreleases/${name}" "$headers_json"
  }
fi

validate_context() {
  local current
  current="$(kubectl config current-context)"
  [[ "$current" == "$EXPECTED_CLUSTER_ARN" ]] || { echo "ERROR: current context $current, expected $EXPECTED_CLUSTER_ARN" >&2; return 1; }
}

capture_regional_pods() {
  local output_file="$1"
  kubectl -n observability get pods -o json | jq -r '
    .items[]
    | select(.metadata.name | test("^(regionalserver|data-server)-"))
    | "observability|\(.metadata.name)|\(.metadata.uid)|\(.status.phase)|\([.status.containerStatuses[]? | "\(.name):\(.restartCount)"] | join(","))"
  ' | sort >"$output_file"
}

verify_regional_helmrelease_ready() {
  kubectl -n ops-system wait --for=condition=Ready helmrelease/regional-server --timeout=5m
  get_helmrelease "${O11Y_OPS_API_BASE_URL:?O11Y_OPS_API_BASE_URL is required}" "regional-server" | jq -e '
    .data.config.version != "" and
    ([.data.status.conditions[]? | select(.type == "Ready" and .status == "True")] | length) > 0
  ' >/dev/null
}

verify_regional_health() {
  kubectl -n observability get deploy regionalserver >/dev/null
  kubectl -n observability get deploy data-server >/dev/null
  kubectl -n observability get svc regionalservice >/dev/null
  kubectl -n observability get svc regional-data-service >/dev/null
}

compare_snapshots() {
  local before="$1"
  local after="$2"
  if ! diff -u "$before" "$after"; then
    echo "ERROR: regionalserver/data-server pods changed during adoption-only step" >&2
    return 1
  fi
}

main() {
  local before after
  validate_context
  if [[ ! -x "$SCRIPT_DIR/ops-server-access-link-check.sh" ]]; then
    echo "ERROR: missing $SCRIPT_DIR/ops-server-access-link-check.sh; complete the ops-server access-link prerequisite first" >&2
    return 1
  fi
  "$SCRIPT_DIR/ops-server-access-link-check.sh"
  before="$(mktemp)"
  after="$(mktemp)"
  trap 'rm -f "$before" "$after"' EXIT
  capture_regional_pods "$before"
  verify_regional_helmrelease_ready
  verify_regional_health
  capture_regional_pods "$after"
  compare_snapshots "$before" "$after"
}

if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
  main "$@"
fi
