# XDC RPC Node Dockerfile
# Lightweight RPC-only node - no mining/consensus
# Optimized for API serving

FROM golang:1.24-alpine AS builder

RUN apk add --no-cache make gcc musl-dev linux-headers git bash

WORKDIR /build
COPY . /build

RUN make XDC && chmod +x /build/build/bin/XDC

# Runtime stage
FROM alpine:3.19

LABEL maintainer="anil@xinfin.org"
LABEL description="XDC RPC Node - API-only, no consensus"
LABEL version="1.0.0"

RUN apk add --no-cache ca-certificates bash curl jq

WORKDIR /xdc

# Copy binary
COPY --from=builder /build/build/bin/XDC /usr/local/bin/XDC

# Copy genesis files
COPY genesis/ ./genesis/

# Create RPC-optimized entrypoint
COPY <<'EOF' /xdc/entrypoint-rpc.sh
#!/bin/bash
set -e

DATA_DIR="${DATA_DIR:-/xdc/data}"
NETWORK_ID="${NETWORK_ID:-50}"
GENESIS_FILE="${GENESIS_FILE:-genesis/xdc_mainnet.json}"

# Initialize if no data
if [[ ! -d "$DATA_DIR/XDC" ]]; then
    echo "Initializing RPC node with genesis..."
    XDC init "$GENESIS_FILE" --datadir "$DATA_DIR"
fi

# RPC-optimized settings
# - Light sync for faster startup
# - Larger cache for RPC performance
# - No mining
RPC_ARGS="--syncmode ${SYNC_MODE:-snap} \
    --cache 8192 \
    --cache.database 60 \
    --cache.trie 25 \
    --cache.gc 15 \
    --txlookuplimit 2628000"

# Extended RPC APIs for comprehensive access
HTTP_ARGS="--http \
    --http.addr 0.0.0.0 \
    --http.port 8545 \
    --http.corsdomain '*' \
    --http.vhosts '*' \
    --http.api eth,net,web3,txpool,debug,personal,admin"

WS_ARGS="--ws \
    --ws.addr 0.0.0.0 \
    --ws.port 8546 \
    --ws.origins '*' \
    --ws.api eth,net,web3,txpool"

# Build common args
COMMON_ARGS="--datadir $DATA_DIR \
    --networkid $NETWORK_ID \
    --verbosity ${VERBOSITY:-3} \
    --maxpeers ${MAXPEERS:-100} \
    --port 30303 \
    --nodiscover=false"

# Add bootnodes if specified
if [[ -n "$BOOTNODES" ]]; then
    COMMON_ARGS="$COMMON_ARGS --bootnodes $BOOTNODES"
fi

# Add external IP if specified  
if [[ -n "$EXTIP" ]]; then
    COMMON_ARGS="$COMMON_ARGS --nat extip:$EXTIP"
fi

# Add identity if specified
if [[ -n "$IDENTITY" ]]; then
    COMMON_ARGS="$COMMON_ARGS --identity ${IDENTITY}-rpc"
fi

# GraphQL support (optional)
if [[ "${ENABLE_GRAPHQL:-false}" == "true" ]]; then
    COMMON_ARGS="$COMMON_ARGS --graphql --graphql.vhosts '*'"
fi

echo "Starting XDC RPC node..."
echo "Data dir: $DATA_DIR"
echo "Network: $NETWORK_ID"
echo "Mode: RPC-only (no mining)"

exec XDC $RPC_ARGS $HTTP_ARGS $WS_ARGS $COMMON_ARGS "$@"
EOF

RUN chmod +x /usr/local/bin/XDC /xdc/entrypoint-rpc.sh

# Environment defaults for RPC node
ENV DATA_DIR='/xdc/data'
ENV NETWORK_ID='50'
ENV VERBOSITY='3'
ENV MAXPEERS='100'
ENV SYNC_MODE='snap'
ENV BOOTNODES=''
ENV EXTIP=''
ENV IDENTITY=''
ENV GENESIS_FILE='genesis/xdc_mainnet.json'
ENV ENABLE_GRAPHQL='false'
ENV NODE_TYPE='rpc'

# Health check - RPC specific
HEALTHCHECK --interval=15s --timeout=5s --start-period=30s --retries=3 \
  CMD curl -sf http://localhost:8545 -X POST -H "Content-Type: application/json" \
      -d '{"jsonrpc":"2.0","method":"net_version","params":[],"id":1}' | jq -e '.result' || exit 1

EXPOSE 8545 8546 30303 30303/udp

VOLUME ["/xdc/data"]

ENTRYPOINT ["/xdc/entrypoint-rpc.sh"]
