#!/usr/bin/env bash
# install-node.sh — Instala un nodo MILITAR en un VPS Linux (Ubuntu/Debian)
#
# El NODO se instala en un VPS Linux (Ubuntu/Debian). El comando se lanza
# desde cualquier SSH (Windows PowerShell, Linux, macOS) conectándote al VPS.
#
# 1) Conéctate al VPS:        ssh root@IP_DEL_VPS
# 2) Pega y ejecuta:          curl -sS https://militar.chat/builds/install-node.sh | bash
#
# O descargar, leer y ejecutar desde el VPS:
#   wget https://militar.chat/builds/install-node.sh
#   cat install-node.sh   # (léelo primero)
#   bash install-node.sh
#
# Qué hace:
#   1. Crea /opt/milnode, descarga milnode.py
#   2. Arranca el nodo una vez (genera node.sqlite + adminSecret)
#   3. Crea usuario milnode sin privilegios
#   4. Instala y activa servicio systemd (arranque automático)
#   5. Abre puertos en ufw (22, 80, 443)
#   6. Muestra el adminSecret — ¡GUÁRDALO!
#   7. Opcional: instala Caddy + pide un dominio para HTTPS

set -euo pipefail

# Puerto del nodo. Por defecto 8780 y NO 8770: en un VPS que ya tenga un nodo de
# otra red (p.ej. LOOKLOCK, que usa 8770) los dos deben poder convivir. Para
# elegir otro:   NODE_PORT=8790 curl -sS .../install-node.sh | bash
NODE_PORT="${NODE_PORT:-8780}"

RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m'
log()  { echo -e "${CYAN}[*]${NC} $1"; }
ok()   { echo -e "${GREEN}[✓]${NC} $1"; }
warn() { echo -e "${YELLOW}[!]${NC} $1"; }
fail() { echo -e "${RED}[✗]${NC} $1"; exit 1; }

if [[ $EUID -ne 0 ]]; then fail "Ejecuta como root:  curl -sS https://militar.chat/builds/install-node.sh | bash"; fi

log "=== Instalador de nodo MILITAR ==="
echo ""

# 1) Python
log "Comprobando Python..."
if command -v python3 &>/dev/null; then
  ok "Python $(python3 --version | cut -d' ' -f2)"
else
  log "Instalando python3..."
  apt-get update -qq && apt-get install -y -qq python3 || fail "No se pudo instalar python3"
  ok "Python $(python3 --version | cut -d' ' -f2)"
fi

# 2) Descargar milnode.py
log "Descargando milnode.py..."
mkdir -p /opt/milnode
wget -q -O /opt/milnode/milnode.py https://militar.chat/builds/milnode.py.txt || fail "No se pudo descargar milnode.py"
ok "milnode.py descargado (21 KB)"

# 3) Arranque manual (genera BD + adminSecret)
log "Arranque manual (primera vez)..."
cd /opt/milnode
python3 /opt/milnode/milnode.py "$NODE_PORT" /opt/milnode/data &
NODE_PID=$!
sleep 2
kill $NODE_PID 2>/dev/null || true
wait $NODE_PID 2>/dev/null || true

if [ ! -f /opt/milnode/data/node.json ]; then fail "El nodo no generó node.json"; fi
ADMIN_SECRET=$(python3 -c "import json; print(json.load(open('/opt/milnode/data/node.json'))['adminSecret'])" 2>/dev/null || echo "")
if [ -z "$ADMIN_SECRET" ]; then fail "No se pudo leer adminSecret de node.json"; fi
ok "Nodo arrancado correctamente"

echo ""
echo -e "${RED}╔══════════════════════════════════════════════════════════════╗${NC}"
echo -e "${RED}║${NC}  ${YELLOW}adminSecret:${NC}  ${GREEN}$ADMIN_SECRET${NC}  ${RED}║${NC}"
echo -e "${RED}║${NC}  ${YELLOW}¡GUÁRDALO!${NC} Sin él la central no podrá gestionar tu nodo. ${RED}║${NC}"
echo -e "${RED}╚══════════════════════════════════════════════════════════════╝${NC}"
echo ""

# 4) Crear usuario milnode
log "Creando usuario milnode..."
id -u milnode &>/dev/null && ok "usuario milnode ya existe" || {
  useradd --system --no-create-home --shell /usr/sbin/nologin milnode
  ok "usuario milnode creado"
}
chown -R milnode:milnode /opt/milnode
ok "permisos asignados"

# 5) Servicio systemd
log "Configurando servicio systemd..."
cat > /etc/systemd/system/milnode.service <<SVC
[Unit]
After=network.target

[Service]
WorkingDirectory=/opt/milnode
ExecStart=/usr/bin/python3 /opt/milnode/milnode.py $NODE_PORT /opt/milnode/data
Restart=always
User=milnode

[Install]
WantedBy=multi-user.target
SVC
systemctl daemon-reload
systemctl enable --now milnode
sleep 2
if systemctl is-active --quiet milnode; then ok "servicio milnode activo (systemd)"
else fail "el servicio milnode no arrancó — revisa: systemctl status milnode"; fi

# 6) Cortafuegos (ufw)
log "Configurando cortafuegos (ufw)..."
if command -v ufw &>/dev/null; then
  ufw allow 22/tcp >/dev/null 2>&1
  ufw allow 80/tcp >/dev/null 2>&1
  ufw allow 443/tcp >/dev/null 2>&1
  # Puerto del nodo ABIERTO: sin dominio/HTTPS el nodo se usa como http://IP:$NODE_PORT.
  # Si luego pones Caddy con un dominio, puedes cerrarlo con:
  #   ufw delete allow $NODE_PORT/tcp
  ufw allow "$NODE_PORT"/tcp >/dev/null 2>&1
  ufw --force enable >/dev/null 2>&1 || true
  ok "ufw: puertos 22, 80, 443 y $NODE_PORT abiertos"
else
  warn "ufw no instalado — abre los puertos $NODE_PORT (nodo), 80 y 443 (HTTPS) manualmente"
fi

# 7) Health check
log "Verificando salud del nodo..."
HEALTH=$(curl -s -m 5 "http://127.0.0.1:$NODE_PORT/health" 2>/dev/null || echo "")
if echo "$HEALTH" | grep -q '"ok": true'; then
  ok "nodo responde OK"
else
  warn "health check no responde — revisa: curl http://127.0.0.1:$NODE_PORT/health"
fi

echo ""
echo -e "${GREEN}╔══════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║${NC}  ✅  Nodo MILITAR instalado y funcionando                ${GREEN}║${NC}"
echo -e "${GREEN}╠══════════════════════════════════════════════════════════════╣${NC}"
echo -e "${GREEN}║${NC}  adminSecret: ${YELLOW}$ADMIN_SECRET${NC}                  ${GREEN}║${NC}"
echo -e "${GREEN}║${NC}  URL:         http://$(curl -s ifconfig.me 2>/dev/null || hostname -I | awk '{print $1}'):$NODE_PORT  ${GREEN}║${NC}"
echo -e "${GREEN}║${NC}  Para HTTPS (recomendado): monta Caddy con un dominio  ${GREEN}║${NC}"
echo -e "${GREEN}║${NC}  y añade al Caddyfile:                                  ${GREEN}║${NC}"
echo -e "${GREEN}║${NC}    tudominio.com { reverse_proxy 127.0.0.1:$NODE_PORT }        ${GREEN}║${NC}"
echo -e "${GREEN}╚══════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${YELLOW}TU NODO YA FUNCIONA.${NC} Registralo aqui con la URL y el adminSecret de arriba:"
echo -e "   ${CYAN}https://militar.chat/registrar-nodo.php${NC}"
echo ""
echo -e "${YELLOW}Sobre el HTTPS:${NC} este script NO instala HTTPS, y no es un olvido."
echo "   El HTTPS necesita un DOMINIO, y el dominio se crea despues (en tu proveedor de DNS)."
echo "   Es OPCIONAL: sin el, los mensajes siguen cifrados de extremo a extremo."
echo "   Si quieres ponerlo, sigue el apartado g) de: https://militar.chat/montar-nodo.php"
