#!/usr/bin/env bash
# Seed both TiDB-importable CSV and SQL fixtures into the disposable OSS
# import/csv/ and import/sql/ prefixes for premium import E2E. Credentials come
# from the ECS RAM role, matching the OSS smoke path, so no static AK/SK is
# committed. The tracked seeddata/import/{csv,sql}/ files are sent as one
# base64-encoded manifest and replayed on the ECS instance by
# seed_alicloud_oss_import.py.
set -euo pipefail
: "${TF_MODULE_DIR:?}"
: "${ALICLOUD_PROFILE:?}"
: "${ALICLOUD_REGION:?}"
if (($#)); then
  echo "unexpected options: $*" >&2
  exit 2
fi
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
csv_file="$script_dir/seeddata/import/csv/test.a.0001.csv"
csv_schema_file="$script_dir/seeddata/import/csv/test-schema-create.sql"
csv_table_schema_file="$script_dir/seeddata/import/csv/test.a-schema.sql"
sql_dir="$script_dir/seeddata/import/sql"
csv_files=("$csv_schema_file" "$csv_table_schema_file" "$csv_file")
for file in "${csv_files[@]}"; do
  if [[ ! -f "$file" ]]; then
    echo "Seed data directory is incomplete: $script_dir/seeddata/import" >&2
    exit 1
  fi
done
sql_files=(
  "$sql_dir/bikeshare.trips-schema.sql"
  "$sql_dir/bikeshare.trips.000000000.sql"
)
for file in "${sql_files[@]}"; do
  if [[ ! -f "$file" ]]; then
    echo "Seed data directory is incomplete: $sql_dir" >&2
    exit 1
  fi
done
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/seed_alicloud_oss_import.py")"
manifest_json='[]'
for file in "${csv_files[@]}" "${sql_files[@]}"; do
  if [[ "$file" == "$sql_dir"/* ]]; then
    object_key="import/sql/bikeshare/$(basename "$file")"
  else
    object_key="import/csv/$(basename "$file")"
  fi
  content_b64="$(base64 -w0 "$file")"
  manifest_json="$(jq -c \
    --arg object_key "$object_key" \
    --arg content_b64 "$content_b64" \
    '. + [{object_key: $object_key, content_b64: $content_b64}]' \
    <<<"$manifest_json")"
done
manifest_b64="$(printf '%s' "$manifest_json" | base64 -w0)"
remote_command="set -eu; temp_script=/tmp/date-integration-oss-import-seed.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' --manifest-b64 '$manifest_b64'"
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 import seed command." >&2
exit 1
