#!/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
  state="$(aws ec2 describe-instances \
    --profile "$AWS_PROFILE" \
    --region "$AWS_REGION" \
    --instance-ids "$INSTANCE_ID" \
    --query 'Reservations[0].Instances[0].State.Name' \
    --output text 2>/dev/null || true)"
  ping_status="$(aws ssm describe-instance-information \
    --profile "$AWS_PROFILE" \
    --region "$AWS_REGION" \
    --filters "Key=InstanceIds,Values=$INSTANCE_ID" \
    --query 'InstanceInformationList[0].PingStatus' \
    --output text 2>/dev/null || true)"

  if [[ "$state" == "running" && "$ping_status" == "Online" ]]; then
    break
  fi
  if [[ "$state" == "terminated" || "$state" == "shutting-down" ]]; then
    echo "Instance $INSTANCE_ID entered unexpected state $state while waiting for services." >&2
    exit 1
  fi
  sleep 10
done

if ((SECONDS >= deadline)); then
  echo "Timed out waiting for SSM to become available on $INSTANCE_ID." >&2
  exit 1
fi

remaining=$((deadline - SECONDS))
if ((remaining < 30)); then
  echo "Less than 30 seconds remain to check services on $INSTANCE_ID." >&2
  exit 1
fi
guest_command="timeout ${remaining}s bash -c 'while true; do systemctl is-active --quiet date-integration.service && exit 0; if systemctl is-failed --quiet date-integration.service; then systemctl status date-integration.service --no-pager; exit 1; fi; sleep 10; done'"
parameters="$(jq -cn --arg command "$guest_command" '{commands: [$command]}')"
command_id="$(aws ssm send-command \
  --profile "$AWS_PROFILE" \
  --region "$AWS_REGION" \
  --instance-ids "$INSTANCE_ID" \
  --document-name AWS-RunShellScript \
  --timeout-seconds "$remaining" \
  --parameters "$parameters" \
  --query 'Command.CommandId' \
  --output text)"

while ((SECONDS < deadline)); do
  status="$(aws ssm get-command-invocation \
    --profile "$AWS_PROFILE" \
    --region "$AWS_REGION" \
    --command-id "$command_id" \
    --instance-id "$INSTANCE_ID" \
    --query Status \
    --output text 2>/dev/null || true)"
  case "$status" in
    Success)
      exit 0
      ;;
    Failed | Cancelled | TimedOut | Cancelling)
      aws ssm get-command-invocation \
        --profile "$AWS_PROFILE" \
        --region "$AWS_REGION" \
        --command-id "$command_id" \
        --instance-id "$INSTANCE_ID" \
        --query '{Status:Status,StatusDetails:StatusDetails,StandardErrorContent:StandardErrorContent}'
      exit 1
      ;;
  esac
  sleep 10
done

echo "Timed out waiting for date-integration.service on $INSTANCE_ID." >&2
exit 1
