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

rpc_url="${ROKO_RPC_URL:-https://rpc.roko.network}"
chain_path="${ROKO_CHAIN_PATH:-/etc/roko/roko-testnet-v2.json}"
dry_run=false

usage() {
  cat <<'EOF'
Usage: bootstrap-roko-chain-spec.sh [--dry-run]

Exports the current ROKO testnet synchronization spec from public RPC without
requiring repository access, preserves wide JSON integers, and installs it at
/etc/roko/roko-testnet-v2.json.

Environment overrides:
  ROKO_RPC_URL     Public RPC endpoint
  ROKO_CHAIN_PATH Destination chain-spec path
EOF
}

while (($#)); do
  case "$1" in
    --dry-run) dry_run=true ;;
    -h|--help) usage; exit 0 ;;
    *) echo "Unknown argument: $1" >&2; usage >&2; exit 2 ;;
  esac
  shift
done

echo "ROKO testnet chain-spec bootstrap"
echo "  RPC: ${rpc_url}"
echo "  destination: ${chain_path}"

if "$dry_run"; then
  exit 0
fi

for command_name in curl python3 install mktemp sha256sum; do
  command -v "$command_name" >/dev/null ||
    { echo "Missing required command: $command_name" >&2; exit 1; }
done

task_tmp="$(mktemp -d)"
cleanup() {
  rm -rf -- "$task_tmp"
}
trap cleanup EXIT

curl --fail --silent --show-error --max-time 30 "$rpc_url" \
  -H 'content-type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"sync_state_genSyncSpec","params":[true]}' \
  --output "$task_tmp/response.json"

python3 - "$task_tmp/response.json" "$task_tmp/chain.json" <<'PY'
import json
import sys
from pathlib import Path

response = json.loads(Path(sys.argv[1]).read_text())
if response.get("error") is not None or not isinstance(response.get("result"), dict):
    raise SystemExit("RPC did not return a chain-spec object")
Path(sys.argv[2]).write_text(json.dumps(response["result"], indent=2) + "\n")
PY

chain_dir="$(dirname "$chain_path")"
if [[ "$(id -u)" -eq 0 ]]; then
  install -d -o root -g root -m 0755 "$chain_dir"
  install -o root -g root -m 0644 "$task_tmp/chain.json" "$chain_path"
elif command -v sudo >/dev/null; then
  sudo install -d -o root -g root -m 0755 "$chain_dir"
  sudo install -o root -g root -m 0644 "$task_tmp/chain.json" "$chain_path"
else
  echo "Root access is required to install $chain_path (sudo not found)." >&2
  exit 1
fi

sha256sum "$chain_path"
echo "Installed current testnet synchronization spec at $chain_path"
