#!/bin/bash
# ═══════════════════════════════════════════════════════════════════════════
# LiberDiscovery v2.0 — Instalador Automático
# curl -sSL https://saas.libernet.com.br/instalador/liberdiscovery/install.sh | sudo bash
# ═══════════════════════════════════════════════════════════════════════════
set -euo pipefail

BASE_URL="https://saas.libernet.com.br/instalador/liberdiscovery"
INSTALL_DIR="/opt/liberdiscovery"
CONFIG_DIR="/etc/liberdiscovery"
LOG_DIR="/var/log/liberdiscovery"
BIN_DIR="/usr/local/bin"
SYSTEMD_DIR="/etc/systemd/system"
VERSION_FILE="${INSTALL_DIR}/.version"
GO_VERSION="1.22.4"
NODE_VERSION="20"

RED='\033[0;31m';GREEN='\033[0;32m';CYAN='\033[0;36m';YELLOW='\033[1;33m';BOLD='\033[1m';NC='\033[0m'
log(){echo -e "${GREEN}[LiberDiscovery]${NC} $1";}
warn(){echo -e "${YELLOW}[AVISO]${NC} $1";}
err(){echo -e "${RED}[ERRO]${NC} $1";exit 1;}
step(){echo -e "\n${CYAN}━━━ Etapa: $1 ━━━${NC}";}

echo -e "${CYAN}"
echo "╔═══════════════════════════════════════════════════════════╗"
echo "║     LiberDiscovery v2.0 — Instalador Automático          ║"
echo "║     Network Monitoring Platform for ISPs                  ║"
echo "╚═══════════════════════════════════════════════════════════╝"
echo -e "${NC}"

[ "$EUID" -eq 0 ] || err "Execute como root: sudo bash install.sh"
. /etc/os-release 2>/dev/null || err "OS não detectado"
[ "$ID" = "ubuntu" ] || [ "$ID" = "debian" ] || err "Requer Ubuntu/Debian"
log "Sistema: $ID $VERSION_ID"

# ─── Buscar versão no servidor ────────────────────────────────────────────
step "Verificando versão disponível"
LATEST_JSON=$(curl -sSf "${BASE_URL}/latest.json") || err "Sem acesso a ${BASE_URL}"
LATEST_VERSION=$(echo "$LATEST_JSON" | jq -r '.version')
log "Versão: ${LATEST_VERSION}"

# ─── Dependências ─────────────────────────────────────────────────────────
step "Dependências do sistema"
apt-get update -qq
apt-get install -y -qq curl wget gnupg2 apt-transport-https ca-certificates \
  lsb-release jq unzip snmp snmpd libsnmp-dev build-essential git nginx redis-server

# ─── Go ───────────────────────────────────────────────────────────────────
step "Go ${GO_VERSION}"
if ! command -v go &>/dev/null; then
  wget -q "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" -O /tmp/go.tar.gz
  rm -rf /usr/local/go && tar -C /usr/local -xzf /tmp/go.tar.gz
  echo 'export PATH=$PATH:/usr/local/go/bin' > /etc/profile.d/golang.sh
  export PATH=$PATH:/usr/local/go/bin
  log "Go ${GO_VERSION} instalado"
else
  log "Go já instalado: $(go version)"
fi

# ─── Node.js ──────────────────────────────────────────────────────────────
step "Node.js ${NODE_VERSION}"
if ! command -v node &>/dev/null; then
  curl -fsSL "https://deb.nodesource.com/setup_${NODE_VERSION}.x" | bash -
  apt-get install -y -qq nodejs
  log "Node.js $(node -v) instalado"
else
  log "Node.js já instalado: $(node -v)"
fi

# ─── PostgreSQL ───────────────────────────────────────────────────────────
step "PostgreSQL"
if ! command -v psql &>/dev/null; then
  sh -c "echo 'deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main' > /etc/apt/sources.list.d/pgdg.list"
  wget -qO- https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
  apt-get update -qq && apt-get install -y -qq postgresql-16 postgresql-client-16
fi
sudo -u postgres psql -tc "SELECT 1 FROM pg_roles WHERE rolname='zabbix'" | grep -q 1 || \
  sudo -u postgres psql -c "CREATE ROLE zabbix LOGIN PASSWORD 'liberdiscovery_db_2024';"
sudo -u postgres psql -tc "SELECT 1 FROM pg_database WHERE datname='zabbix'" | grep -q 1 || \
  sudo -u postgres createdb -O zabbix zabbix
log "PostgreSQL OK"

# ─── Zabbix ───────────────────────────────────────────────────────────────
step "Zabbix Server 7.0"
if ! systemctl is-active --quiet zabbix-server 2>/dev/null; then
  wget -q "https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest+ubuntu${VERSION_ID}_all.deb" -O /tmp/zbx.deb 2>/dev/null || \
  wget -q "https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest+ubuntu24.04_all.deb" -O /tmp/zbx.deb
  dpkg -i /tmp/zbx.deb && apt-get update -qq
  apt-get install -y -qq zabbix-server-pgsql zabbix-frontend-php php8.3-pgsql php8.3-fpm zabbix-sql-scripts zabbix-agent2
  sudo -u zabbix psql -d zabbix -c "SELECT 1 FROM hosts LIMIT 1" &>/dev/null 2>&1 || \
    zcat /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz | sudo -u zabbix psql zabbix
  sed -i "s/# DBPassword=/DBPassword=liberdiscovery_db_2024/" /etc/zabbix/zabbix_server.conf
  sed -i "s/# CacheSize=32M/CacheSize=128M/" /etc/zabbix/zabbix_server.conf
  sed -i "s/# StartPollers=5/StartPollers=10/" /etc/zabbix/zabbix_server.conf
  systemctl enable --now zabbix-server zabbix-agent2
fi
log "Zabbix OK"

# ─── Diretórios ───────────────────────────────────────────────────────────
step "Estrutura de diretórios"
mkdir -p "$INSTALL_DIR"/{api,frontend,backups} "$CONFIG_DIR/snmp-profiles" "$LOG_DIR"
id -u liberdiscovery &>/dev/null || useradd -r -s /bin/false -d "$INSTALL_DIR" liberdiscovery

# ─── Baixar e instalar pacotes ────────────────────────────────────────────
step "Baixando pacotes v${LATEST_VERSION}"
TMP=$(mktemp -d)

API_PKG=$(echo "$LATEST_JSON" | jq -r '.packages.api')
FE_PKG=$(echo "$LATEST_JSON" | jq -r '.packages.frontend')
PROF_PKG=$(echo "$LATEST_JSON" | jq -r '.packages.profiles')
NGX_PKG=$(echo "$LATEST_JSON" | jq -r '.packages.nginx')

log "Baixando API..."
curl -sSfL "${BASE_URL}/${API_PKG}" -o "$TMP/api-src.tar.gz"

log "Baixando Frontend..."
curl -sSfL "${BASE_URL}/${FE_PKG}" -o "$TMP/frontend-src.tar.gz"

log "Baixando SNMP Profiles..."
curl -sSfL "${BASE_URL}/${PROF_PKG}" -o "$TMP/profiles.tar.gz"

log "Baixando Nginx config..."
curl -sSfL "${BASE_URL}/${NGX_PKG}" -o "$TMP/nginx.conf"

# ─── Compilar API Go ──────────────────────────────────────────────────────
step "Compilando API Go"
mkdir -p "$TMP/api-build"
tar -xzf "$TMP/api-src.tar.gz" -C "$TMP/api-build/"
cd "$TMP/api-build"
export PATH=$PATH:/usr/local/go/bin
go mod tidy 2>/dev/null || true
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o "$BIN_DIR/liberdiscovery-api" ./cmd/server/
cd /
log "API compilada: $BIN_DIR/liberdiscovery-api"

# ─── Build Frontend React ─────────────────────────────────────────────────
step "Compilando Frontend React"
mkdir -p "$TMP/fe-build"
tar -xzf "$TMP/frontend-src.tar.gz" -C "$TMP/fe-build/"
cd "$TMP/fe-build"
npm install --silent 2>/dev/null
npm run build 2>/dev/null
cp -r dist/* "$INSTALL_DIR/frontend/" 2>/dev/null || cp -r "$TMP/fe-build"/* "$INSTALL_DIR/frontend/"
cd /
log "Frontend compilado"

# ─── Instalar SNMP Profiles ──────────────────────────────────────────────
tar -xzf "$TMP/profiles.tar.gz" -C "$CONFIG_DIR/snmp-profiles/"
log "16 SNMP profiles instalados"

# ─── Nginx ────────────────────────────────────────────────────────────────
step "Configurando Nginx"
cp "$TMP/nginx.conf" /etc/nginx/sites-available/liberdiscovery
ln -sf /etc/nginx/sites-available/liberdiscovery /etc/nginx/sites-enabled/liberdiscovery
rm -f /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx
log "Nginx configurado"

# ─── Config ───────────────────────────────────────────────────────────────
if [ ! -f "$CONFIG_DIR/config.env" ]; then
  cat > "$CONFIG_DIR/config.env" << 'CFGEOF'
# LiberDiscovery — Configuração
# Edite e reinicie: systemctl restart liberdiscovery

LIBERDISCOVERY_PORT=8080
LIBERDISCOVERY_HOST=0.0.0.0
ZABBIX_URL=http://localhost:8081/api_jsonrpc.php
ZABBIX_USER=Admin
ZABBIX_PASSWORD=zabbix
REDIS_ADDR=localhost:6379
LICENSE_SERVER_URL=https://saas.libernet.com.br/api
LIBERDISCOVERY_LICENSE_KEY=
AUTO_UPDATE_ENABLED=true
CFGEOF
  chmod 600 "$CONFIG_DIR/config.env"
  log "Config criado: $CONFIG_DIR/config.env"
fi

# ─── Versão ───────────────────────────────────────────────────────────────
echo "$LATEST_VERSION" > "$VERSION_FILE"
chown -R liberdiscovery:liberdiscovery "$INSTALL_DIR" "$LOG_DIR"

# ─── Updater ──────────────────────────────────────────────────────────────
step "Auto-updater"
cat > "$BIN_DIR/liberdiscovery-updater" << 'UPD'
#!/bin/bash
set -euo pipefail
BASE_URL="https://saas.libernet.com.br/instalador/liberdiscovery"
ID="/opt/liberdiscovery";CD="/etc/liberdiscovery";BD="/usr/local/bin";VF="${ID}/.version"
export PATH=$PATH:/usr/local/go/bin
[ -f "$CD/config.env" ] && source "$CD/config.env"
[ "${AUTO_UPDATE_ENABLED:-true}" != "true" ] && exit 0
CUR=$(cat "$VF" 2>/dev/null||echo "0.0.0")
JSON=$(curl -sSf "${BASE_URL}/latest.json" 2>/dev/null)||{ echo "$(date) Servidor indisponível";exit 1; }
NEW=$(echo "$JSON"|jq -r '.version')
[ "$CUR" = "$NEW" ] && { echo "$(date) Atualizado v${CUR}";exit 0; }
echo "$(date) Atualizando v${CUR} → v${NEW}"
BK="${ID}/backups/v${CUR}-$(date +%Y%m%d%H%M%S)";mkdir -p "$BK"
cp "$BD/liberdiscovery-api" "$BK/" 2>/dev/null||true
T=$(mktemp -d)
curl -sSfL "${BASE_URL}/$(echo $JSON|jq -r '.packages.api')" -o "$T/api-src.tar.gz"
curl -sSfL "${BASE_URL}/$(echo $JSON|jq -r '.packages.frontend')" -o "$T/fe-src.tar.gz"
curl -sSfL "${BASE_URL}/$(echo $JSON|jq -r '.packages.profiles')" -o "$T/profiles.tar.gz"
# Build API
mkdir -p "$T/api-build";tar -xzf "$T/api-src.tar.gz" -C "$T/api-build/"
cd "$T/api-build";go mod tidy 2>/dev/null||true
CGO_ENABLED=0 go build -ldflags="-s -w" -o "$T/liberdiscovery-api" ./cmd/server/ || { echo "$(date) ❌ Build API falhou";exit 1; }
# Build Frontend
mkdir -p "$T/fe-build";tar -xzf "$T/fe-src.tar.gz" -C "$T/fe-build/"
cd "$T/fe-build";npm install --silent 2>/dev/null;npm run build 2>/dev/null||true
# Stop, install, start
systemctl stop liberdiscovery
cp "$T/liberdiscovery-api" "$BD/liberdiscovery-api"
rm -rf "$ID/frontend/dist";mkdir -p "$ID/frontend/dist"
[ -d "$T/fe-build/dist" ] && cp -r "$T/fe-build/dist/"* "$ID/frontend/" || cp -r "$T/fe-build/"* "$ID/frontend/"
tar -xzf "$T/profiles.tar.gz" -C "$CD/snmp-profiles/"
echo "$NEW" > "$VF";chown -R liberdiscovery:liberdiscovery "$ID"
systemctl start liberdiscovery;systemctl reload nginx;rm -rf "$T";cd /
sleep 3
if systemctl is-active --quiet liberdiscovery; then echo "$(date) ✅ v${NEW} instalado"
else echo "$(date) ❌ Rollback";cp "$BK/liberdiscovery-api" "$BD/";echo "$CUR">"$VF";systemctl start liberdiscovery;fi
UPD
chmod +x "$BIN_DIR/liberdiscovery-updater"
log "Updater instalado"

# ─── CLI ──────────────────────────────────────────────────────────────────
cat > "$BIN_DIR/liberdiscovery-ctl" << 'CLI'
#!/bin/bash
D="/opt/liberdiscovery";C="/etc/liberdiscovery";V=$(cat "$D/.version" 2>/dev/null||echo "?")
case "${1:-help}" in
status) echo "LiberDiscovery v${V}";echo "";for s in liberdiscovery zabbix-server redis-server nginx postgresql;do st=$(systemctl is-active $s 2>/dev/null||echo "off");echo "  $([ "$st" = "active" ]&&echo ✅||echo ❌) $s: $st";done;echo "";curl -s localhost:8080/api/v1/health 2>/dev/null|jq . ||echo "  API offline";;
update) echo "Verificando atualizações...";liberdiscovery-updater;;
update-force) echo "Forçando...";echo "0.0.0">$D/.version;liberdiscovery-updater;;
restart) systemctl restart liberdiscovery;echo "✅ Reiniciado";;
stop) systemctl stop liberdiscovery;echo "⏹ Parado";;
start) systemctl start liberdiscovery;echo "▶ Iniciado";;
logs) journalctl -u liberdiscovery -f --no-pager;;
logs-update) cat /var/log/liberdiscovery/update.log 2>/dev/null||echo "Sem logs";;
config) ${EDITOR:-nano} $C/config.env;echo "Reiniciar? (s/N)";read r;[ "$r" = "s" ]&&systemctl restart liberdiscovery&&echo "✅ Reiniciado";;
license) [ -n "${2:-}" ]&&{ sed -i "s/^LIBERDISCOVERY_LICENSE_KEY=.*/LIBERDISCOVERY_LICENSE_KEY=$2/" $C/config.env;systemctl restart liberdiscovery;echo "✅ Licença atualizada";sleep 2; };curl -s localhost:8080/api/v1/license/status 2>/dev/null|jq '.data'||echo "API offline";;
version) echo "LiberDiscovery v${V}";;
uninstall) echo "⚠ Remover LiberDiscovery? (Zabbix mantido). Digite 'sim':";read r;[ "$r"="sim" ]&&{ systemctl stop liberdiscovery;systemctl disable liberdiscovery liberdiscovery-update.timer 2>/dev/null;rm -f $SYSTEMD_DIR/liberdiscovery*;rm -f /usr/local/bin/liberdiscovery-*;rm -rf /opt/liberdiscovery;rm -f /etc/nginx/sites-enabled/liberdiscovery;systemctl daemon-reload;systemctl reload nginx;echo "✅ Removido"; };;
help|*) echo "LiberDiscovery v${V} — Comandos:";echo "";echo "  status update update-force restart stop start";echo "  logs logs-update config license [KEY] version uninstall";;
esac
CLI
chmod +x "$BIN_DIR/liberdiscovery-ctl"

# ─── Systemd ──────────────────────────────────────────────────────────────
step "Serviços systemd"
cat > "$SYSTEMD_DIR/liberdiscovery.service" << SVC
[Unit]
Description=LiberDiscovery API Server
After=network.target zabbix-server.service redis-server.service postgresql.service
Wants=zabbix-server.service redis-server.service
[Service]
Type=simple
User=liberdiscovery
Group=liberdiscovery
WorkingDirectory=${INSTALL_DIR}/api
EnvironmentFile=${CONFIG_DIR}/config.env
ExecStart=${BIN_DIR}/liberdiscovery-api
Restart=always
RestartSec=5
StandardOutput=append:${LOG_DIR}/api.log
StandardError=append:${LOG_DIR}/api-error.log
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
SVC

cat > "$SYSTEMD_DIR/liberdiscovery-update.service" << 'US'
[Unit]
Description=LiberDiscovery Auto-Update
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/liberdiscovery-updater
StandardOutput=append:/var/log/liberdiscovery/update.log
StandardError=append:/var/log/liberdiscovery/update-error.log
US

cat > "$SYSTEMD_DIR/liberdiscovery-update.timer" << 'UT'
[Unit]
Description=LiberDiscovery Daily Update Check
[Timer]
OnCalendar=*-*-* 03:00:00
RandomizedDelaySec=1800
Persistent=true
[Install]
WantedBy=timers.target
UT

systemctl daemon-reload
systemctl enable --now liberdiscovery liberdiscovery-update.timer
systemctl restart redis-server nginx

# ─── Cleanup ──────────────────────────────────────────────────────────────
rm -rf "$TMP"

# ─── Resumo ───────────────────────────────────────────────────────────────
IP=$(hostname -I | awk '{print $1}')
echo ""
echo -e "${GREEN}═══════════════════════════════════════════════════════════════${NC}"
echo -e "${GREEN}  ✅ LiberDiscovery v${LATEST_VERSION} — Instalação Concluída!     ${NC}"
echo -e "${GREEN}═══════════════════════════════════════════════════════════════${NC}"
echo ""
echo -e "  ${CYAN}Dashboard:${NC}     http://${IP}/"
echo -e "  ${CYAN}API Health:${NC}    http://${IP}/api/v1/health"
echo -e "  ${CYAN}Zabbix:${NC}        http://${IP}/zabbix/  (Admin / zabbix)"
echo ""
echo -e "  ${BOLD}Ativar licença:${NC}"
echo -e "    ${CYAN}liberdiscovery-ctl license NT-XXXX-XXXX-XXXX${NC}"
echo ""
echo -e "  ${BOLD}Comandos:${NC}"
echo "    liberdiscovery-ctl status      — Status dos serviços"
echo "    liberdiscovery-ctl update      — Verificar atualizações"
echo "    liberdiscovery-ctl logs        — Logs em tempo real"
echo "    liberdiscovery-ctl config      — Editar configuração"
echo ""
echo -e "  ${BOLD}Atualização automática:${NC} diária às 03:00"
echo ""
