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

REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
STACK_DIR="${REPO_ROOT}/infra/blockchain-devnet"
RPC_URL="${BLOCKCHAIN_RPC_URL:-http://127.0.0.1:${BLOCKCHAIN_RPC_PORT:-8545}}"
RPC_GATEWAY_URL="${BLOCKCHAIN_RPC_GATEWAY_URL:-http://127.0.0.1:${BLOCKCHAIN_RPC_GATEWAY_PORT:-18545}}"

usage() {
    cat <<'EOF'
Usage: ./jeannie blockchain-devnet {status|up|down|logs|rpc}

status  Show local devnet containers and RPC health.
up      Start the local Anvil devnet.
down    Stop the local Anvil devnet.
logs    Follow devnet logs.
rpc     Print the configured JSON-RPC endpoint.
EOF
}

rpc_call() {
    local method="$1"

    curl -fsS -X POST "$RPC_URL" \
        -H 'content-type: application/json' \
        --data "{\"jsonrpc\":\"2.0\",\"method\":\"${method}\",\"params\":[],\"id\":1}"
}

case "${1:-status}" in
    status)
        echo "Blockchain devnet stack: ${STACK_DIR}"
        if command -v docker >/dev/null 2>&1; then
            (cd "$STACK_DIR" && docker compose ps) || true
        else
            echo "docker compose unavailable; cannot inspect local devnet stack"
        fi

        echo
        echo "RPC endpoint: ${RPC_URL}"
        echo "RPC gateway: ${RPC_GATEWAY_URL}"
        if rpc_call eth_chainId >/tmp/homelab-blockchain-chainid.json 2>/tmp/homelab-blockchain-rpc.err; then
            printf 'chainId: '
            cat /tmp/homelab-blockchain-chainid.json
            echo
            printf 'blockNumber: '
            rpc_call eth_blockNumber || true
            echo
        else
            echo "RPC unavailable"
            sed 's/^/  /' /tmp/homelab-blockchain-rpc.err >&2 || true
        fi
        ;;
    up)
        cd "$STACK_DIR"
        docker compose up -d
        ;;
    down)
        cd "$STACK_DIR"
        docker compose down
        ;;
    logs)
        cd "$STACK_DIR"
        docker compose logs -f --tail=100
        ;;
    rpc)
        echo "raw=${RPC_URL}"
        echo "gateway=${RPC_GATEWAY_URL}"
        ;;
    -h|--help|help)
        usage
        ;;
    *)
        usage >&2
        exit 1
        ;;
esac
