#!/bin/bash
# Instalador de un nodo BLG24 (Ubuntu 24.04, x86_64). Uso: sudo bash instalar-validador.sh NOMBRE
set -euo pipefail
BASE="https://gold24coin.com/descargas"
RPC="https://node.gold24coin.com"
PEER_ID="c32d44396197d4f5a782318cd5e96ec57ff36afa"
PEER="${PEER_ID}@141.95.29.13:26656"
BIN_SHA="2e0c426678b30ac14fc6cf311fdae738064ecbbfe1b550329d5de7f3ce061d0b"
GEN_SHA="7ba6c3ffeb43923bdae8c5ddf14f256ec591be6772c675f6e970c7796bf29adc"
USR="blg24"; HOME_N="/home/$USR/.blg24"
say(){ echo; echo "== $*"; }
[ "$(id -u)" = "0" ] || { echo "Ejecuta con sudo."; exit 1; }
[ "$(uname -m)" = "x86_64" ] || { echo "Este instalador es solo para servidores x86_64."; exit 1; }
MON="${1:-}"
[[ "$MON" =~ ^[A-Za-z0-9-]{3,30}$ ]] || { echo "Falta el nombre del validador (3 a 30 letras, numeros o guiones). Ejemplo: sudo bash instalar-validador.sh mi-validador"; exit 1; }
[ ! -e "$HOME_N/config/genesis.json" ] || { echo "Ya hay un nodo instalado en $HOME_N. No se toca nada."; exit 1; }

say "1/8 Instalando herramientas"
export DEBIAN_FRONTEND=noninteractive
apt-get update -qq && apt-get install -y -qq curl jq ufw >/dev/null

say "2/8 Cerrando el acceso (solo SSH y red BLG24)"
ufw allow 22/tcp >/dev/null && ufw allow 26656/tcp >/dev/null && ufw --force enable >/dev/null

say "3/8 Bajando y comprobando el programa"
curl -fsSL "$BASE/blg24-linux-amd64" -o /tmp/blg24.bin
[ "$(sha256sum /tmp/blg24.bin | cut -d' ' -f1)" = "$BIN_SHA" ] || { echo "La huella del programa NO coincide. No se instala nada."; exit 1; }
install -m 755 /tmp/blg24.bin /usr/local/bin/blg24 && rm -f /tmp/blg24.bin
id "$USR" >/dev/null 2>&1 || useradd -m -s /bin/bash "$USR"

say "4/8 Iniciando el nodo ($MON)"
sudo -u "$USR" /usr/local/bin/blg24 init "$MON" --chain-id BLG24 --home "$HOME_N" >/dev/null 2>&1
curl -fsSL "$BASE/genesis.json" -o /tmp/genesis.json
[ "$(sha256sum /tmp/genesis.json | cut -d' ' -f1)" = "$GEN_SHA" ] || { echo "La huella del genesis NO coincide. Se detiene."; exit 1; }
install -m 644 -o "$USR" -g "$USR" /tmp/genesis.json "$HOME_N/config/genesis.json" && rm -f /tmp/genesis.json

say "5/8 Configurando la conexion y la descarga rapida (state sync)"
LATEST=$(curl -fsS "$RPC/status" | jq -r '.result.sync_info.latest_block_height')
TRUST=$((LATEST-1000))
HASH=$(curl -fsS "$RPC/block?height=$TRUST" | jq -r '.result.block_id.hash')
[ -n "$HASH" ] && [ "$HASH" != "null" ] || { echo "No se pudo leer el bloque de confianza."; exit 1; }
C="$HOME_N/config/config.toml"; A="$HOME_N/config/app.toml"
sed -i "s|^persistent_peers = .*|persistent_peers = \"$PEER\"|" "$C"
sed -i '/^\[statesync\]/,/^\[/ { s|^enable = .*|enable = true|; s|^rpc_servers = .*|rpc_servers = "'"$RPC"':443,'"$RPC"':443"|; s|^trust_height = .*|trust_height = '"$TRUST"'|; s|^trust_hash = .*|trust_hash = "'"$HASH"'"| }' "$C"
sed -i 's|^minimum-gas-prices = .*|minimum-gas-prices = "0ug24"|' "$A"
grep -q "^enable = true" <(sed -n '/^\[statesync\]/,/^\[/p' "$C") || { echo "No se pudo activar el state sync."; exit 1; }

say "6/8 Creando el servicio"
cat > /etc/systemd/system/blg24.service <<EOF
[Unit]
Description=BLG24 nodo
After=network-online.target
[Service]
User=$USR
ExecStart=/usr/local/bin/blg24 start --home $HOME_N
Restart=always
RestartSec=3
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable --now blg24 >/dev/null 2>&1

say "7/8 Esperando a que se ponga al dia (puede tardar unos minutos)"
for i in $(seq 1 90); do
  sleep 10
  S=$(curl -fsS http://localhost:26657/status 2>/dev/null || true)
  if [ -n "$S" ]; then
    CU=$(echo "$S" | jq -r '.result.sync_info.catching_up'); H=$(echo "$S" | jq -r '.result.sync_info.latest_block_height')
    echo "   altura $H, poniendose al dia: $CU"
    [ "$CU" = "false" ] && [ "$H" -gt 0 ] && break
  else echo "   arrancando..."; fi
done

say "8/8 Resultado"
S=$(curl -fsS http://localhost:26657/status 2>/dev/null || true)
if [ -n "$S" ] && [ "$(echo "$S" | jq -r '.result.sync_info.catching_up')" = "false" ]; then
  echo "LISTO: el nodo esta al dia (altura $(echo "$S" | jq -r '.result.sync_info.latest_block_height'))."
  echo "Siguiente paso: crear tu cuenta y tu validador (te lo indica quien te dio este instalador)."
else
  echo "El nodo sigue sincronizando. Mira el estado con: journalctl -u blg24 -n 20 --no-pager"
fi
