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

: "${AWS_PROFILE:?AWS_PROFILE is required}"
: "${AWS_REGION:?AWS_REGION is required}"
: "${INSTANCE_ID:?INSTANCE_ID is required}"

timeout_seconds="${BOOTSTRAP_TIMEOUT:-1800}"
deadline=$((SECONDS + timeout_seconds))

while ((SECONDS < deadline)); do
  instance_json="$(aws ec2 describe-instances \
    --profile "$AWS_PROFILE" \
    --region "$AWS_REGION" \
    --instance-ids "$INSTANCE_ID" \
    --output json)"
  state="$(jq -r '.Reservations[0].Instances[0].State.Name' <<<"$instance_json")"
  status="$(jq -r '[.Reservations[0].Instances[0].Tags[]? | select(.Key == "BootstrapStatus") | .Value][0] // "pending"' <<<"$instance_json")"

  case "$status" in
    ready)
      exit 0
      ;;
    failed)
      echo "EC2 bootstrap failed for $INSTANCE_ID; inspect /var/log/cloud-init-output.log through SSM." >&2
      exit 1
      ;;
  esac

  if [[ "$state" == "terminated" || "$state" == "shutting-down" ]]; then
    echo "Instance $INSTANCE_ID entered unexpected state $state during bootstrap." >&2
    exit 1
  fi
  sleep 10
done

echo "Timed out after ${timeout_seconds}s waiting for BootstrapStatus=ready on $INSTANCE_ID." >&2
exit 1
