#!/usr/bin/env bash
# install-node.sh — Instala un nodo LOOKLOCK 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://looklock.chat/builds/install-node.sh | bash
#
# O descargar, leer y ejecutar desde el VPS:
#   wget https://looklock.chat/builds/install-node.sh
#   cat install-node.sh   # (léelo primero)
#   bash install-node.sh
#
# Qué hace:
#   1. Crea /opt/llnode, descarga llnode.py
#   2. Arranca el nodo una vez (genera node.sqlite + adminSecret)
#   3. Crea usuario llnode 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

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://looklock.chat/builds/install-node.sh | bash"; fi

log "=== Instalador de nodo LOOKLOCK ==="
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 llnode.py
log "Descargando llnode.py..."
mkdir -p /opt/llnode
wget -q -O /opt/llnode/llnode.py https://looklock.chat/builds/llnode.py.txt || fail "No se pudo descargar llnode.py"
ok "llnode.py descargado"

# 3) Arranque manual (genera BD + adminSecret)
log "Arranque manual (primera vez)..."
cd /opt/llnode
python3 /opt/llnode/llnode.py 8770 /opt/llnode/data &
NODE_PID=$!
sleep 2
kill $NODE_PID 2>/dev/null || true
wait $NODE_PID 2>/dev/null || true

if [ ! -f /opt/llnode/data/node.json ]; then fail "El nodo no generó node.json"; fi
ADMIN_SECRET=$(python3 -c "import json; print(json.load(open('/opt/llnode/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 llnode
log "Creando usuario llnode..."
id -u llnode &>/dev/null && ok "usuario llnode ya existe" || {
  useradd --system --no-create-home --shell /usr/sbin/nologin llnode
  ok "usuario llnode creado"
}
chown -R llnode:llnode /opt/llnode
ok "permisos asignados"

# 5) Servicio systemd
log "Configurando servicio systemd..."
cat > /etc/systemd/system/llnode.service <<'SVC'
[Unit]
After=network.target

[Service]
WorkingDirectory=/opt/llnode
ExecStart=/usr/bin/python3 /opt/llnode/llnode.py 8770 /opt/llnode/data
Restart=always
User=llnode

[Install]
WantedBy=multi-user.target
SVC
systemctl daemon-reload
systemctl enable --now llnode
sleep 2
if systemctl is-active --quiet llnode; then ok "servicio llnode activo (systemd)"
else fail "el servicio llnode no arrancó — revisa: systemctl status llnode"; 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
  # 8770 ABIERTO: sin dominio/HTTPS el nodo se usa como http://IP:8770. Si luego pones
  # Caddy con un dominio, puedes cerrarlo con:  ufw delete allow 8770/tcp
  ufw allow 8770/tcp >/dev/null 2>&1
  ufw --force enable >/dev/null 2>&1 || true
  ok "ufw: puertos 22, 80, 443 y 8770 abiertos"
else
  warn "ufw no instalado — abre los puertos 8770 (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:8770/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:8770/health"
fi

echo ""
echo -e "${GREEN}╔══════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║${NC}  ✅  Nodo LOOKLOCK 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}'):8770  ${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:8770 }        ${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://looklock.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://looklock.chat/montar-nodo.php"
