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

: "${TF_MODULE_DIR:?}"
: "${ALICLOUD_PROFILE:?}"
: "${ALICLOUD_REGION:?}"

script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
instance_id="$(terraform -chdir="$TF_MODULE_DIR" output -json instance | jq -er '.id')"
storage_json="$(terraform -chdir="$TF_MODULE_DIR" output -json object_storage)"
bucket="$(jq -er '.bucket_name' <<<"$storage_json")"
endpoint="$(jq -er '.intranet_endpoint' <<<"$storage_json")"
role_name="$(jq -er '.ram_role_name' <<<"$storage_json")"
python_b64="$(base64 -w0 "$script_dir/smoke_alicloud_oss.py")"
remote_command="set -eu; temp_script=/tmp/date-integration-oss-smoke.py; trap 'rm -f \"\$temp_script\"' EXIT; printf '%s' '$python_b64' | base64 -d >\"\$temp_script\"; chmod 600 \"\$temp_script\"; python3 \"\$temp_script\" --bucket '$bucket' --endpoint '$endpoint' --role-name '$role_name'"
command_content="$(printf '%s' "$remote_command" | base64 -w0)"

response="$(aliyun ecs RunCommand \
  --profile "$ALICLOUD_PROFILE" \
  --RegionId "$ALICLOUD_REGION" \
  --Type RunShellScript \
  --CommandContent "$command_content" \
  --ContentEncoding Base64 \
  --InstanceId.1 "$instance_id" \
  --KeepCommand false \
  --Timeout 120)"
invoke_id="$(jq -er '.InvokeId' <<<"$response")"

for _ in $(seq 1 40); do
  invocation="$(aliyun ecs DescribeInvocations \
    --profile "$ALICLOUD_PROFILE" \
    --RegionId "$ALICLOUD_REGION" \
    --InvokeId "$invoke_id" \
    --InstanceId "$instance_id" \
    --IncludeOutput true)"
  result="$(jq -c '.Invocations.Invocation[0].InvokeInstances.InvokeInstance[0]' <<<"$invocation")"
  status="$(jq -r '.InvocationStatus // empty' <<<"$result")"
  if [[ "$status" == "Success" || "$status" == "Failed" ]]; then
    jq -r '.Output' <<<"$result" | base64 -d
    [[ "$status" == "Success" && "$(jq -r '.ExitCode' <<<"$result")" == "0" ]]
    exit
  fi
  sleep 3
done

echo "Timed out waiting for Alibaba Cloud OSS smoke command." >&2
exit 1
