#!/bin/sh
# XDC Unified Node Start Script
# Supports: mainnet (50) + apothem (51), HBSS + PBSS, full + archive

set -e

DATADIR="/work/xdcchain"

# ── Network selection ──────────────────────────────────────
case "${NETWORK:-mainnet}" in
  mainnet|50)
    NETWORK_ID=50
    GENESIS="/genesis/mainnet.json"
    ;;
  apothem|testnet|51)
    NETWORK_ID=51
    GENESIS="/genesis/apothem.json"
    ;;
  *)
    echo "ERROR: Unknown NETWORK=${NETWORK}. Use mainnet or apothem"
    exit 1
    ;;
esac

# ── State scheme validation ────────────────────────────────
case "${STATE_SCHEME:-hash}" in
  hash|path) ;;
  *)
    echo "ERROR: Unknown STATE_SCHEME=${STATE_SCHEME}. Use hash or path"
    exit 1
    ;;
esac

# ── GC mode validation ─────────────────────────────────────
case "${GC_MODE:-full}" in
  full|archive) ;;
  *)
    echo "ERROR: Unknown GC_MODE=${GC_MODE}. Use full or archive"
    exit 1
    ;;
esac

echo "=== XDC Unified Node ==="
echo "  Network:      ${NETWORK_ID} (${NETWORK})"
echo "  State scheme: ${STATE_SCHEME:-hash}"
echo "  GC mode:      ${GC_MODE:-full}"
echo "  Syncmode:     ${SYNCMODE:-full}"
echo "  Cache:        ${CACHE:-4096} MB"
echo "  MaxPeers:     ${MAXPEERS:-50}"

# ── Init genesis if needed ─────────────────────────────────
CHAINDATA_DIR="${DATADIR}/geth/chaindata"
if [ ! -f "${CHAINDATA_DIR}/CURRENT" ]; then
  echo "Initializing genesis (state.scheme=${STATE_SCHEME:-hash})..."
  XDC init --datadir "${DATADIR}" --state.scheme "${STATE_SCHEME:-hash}" "${GENESIS}"
else
  echo "Existing chaindata found"
fi

# ── Bootnodes ──────────────────────────────────────────────
BOOTNODES_ARG=""
if [ -n "${BOOTNODES}" ]; then
  BOOTNODES_ARG="--bootnodes ${BOOTNODES}"
elif [ -f "${BOOTNODES_FILE}" ]; then
  BN=$(grep -v '^#' "${BOOTNODES_FILE}" | grep -v '^$' | tr '\n' ',' | sed 's/,$//')
  [ -n "$BN" ] && BOOTNODES_ARG="--bootnodes ${BN}"
elif [ -f "/work/bootnodes.list" ]; then
  BN=$(grep -v '^#' /work/bootnodes.list | grep -v '^$' | tr '\n' ',' | sed 's/,$//')
  [ -n "$BN" ] && BOOTNODES_ARG="--bootnodes ${BN}"
fi

# ── External IP ────────────────────────────────────────────
NAT_ARG=""
if [ -n "${EXTERNAL_IP}" ]; then
  NAT_ARG="--nat extip:${EXTERNAL_IP}"
else
  EXT=$(wget -qO- https://checkip.amazonaws.com 2>/dev/null || true)
  [ -n "$EXT" ] && NAT_ARG="--nat extip:${EXT}"
fi

# ── HTTP API ───────────────────────────────────────────────
HTTP_API="${HTTP_API:-admin,eth,net,web3,xdpos}"

# ── Start node ─────────────────────────────────────────────
exec XDC \
  --datadir "${DATADIR}" \
  --networkid "${NETWORK_ID}" \
  --port "${P2P_PORT:-30303}" \
  --syncmode "${SYNCMODE:-full}" \
  --state.scheme "${STATE_SCHEME:-hash}" \
  --gcmode "${GC_MODE:-full}" \
  --verbosity "${VERBOSITY:-3}" \
  --cache "${CACHE:-4096}" \
  --maxpeers "${MAXPEERS:-50}" \
  ${BOOTNODES_ARG} \
  ${NAT_ARG} \
  --http \
  --http.addr 0.0.0.0 \
  --http.port "${HTTP_PORT:-8545}" \
  --http.api "${HTTP_API}" \
  --http.corsdomain "*" \
  --http.vhosts "*" \
  --ws \
  --ws.addr 0.0.0.0 \
  --ws.port "${WS_PORT:-8546}" \
  --ws.api "eth,net,web3" \
  --ws.origins "*" \
  --authrpc.port "${AUTHRPC_PORT:-8561}"
