#!/bin/bash
# ============================================================
# Libernet License Server — Instalador/Atualizador Automático
# ============================================================
# Instala ou atualiza o servidor de licenças automaticamente
#
# Instalação: curl -sSL https://saas.libernet.com.br/instalador/serverlicense/install.sh | sudo bash
# Atualização: sudo libernet-update
# ============================================================
set -e

GREEN='\033[0;32m';BLUE='\033[0;34m';YELLOW='\033[1;33m';RED='\033[0;31m';BOLD='\033[1m';NC='\033[0m'
DIR="/opt/libernet-licenses"
SERVICE="libernet-licenses"
BASE_URL="https://saas.libernet.com.br/instalador/serverlicense"
REQUIRED_NODE_MAJOR=18

echo -e "${BLUE}${BOLD}"
echo "╔═══════════════════════════════════════════════════╗"
echo "║     Libernet License Server — Instalador v2.0      ║"
echo "║     Servidor de Licenças Multi-Produto             ║"
echo "╚═══════════════════════════════════════════════════╝"
echo -e "${NC}"

[ "$EUID" -ne 0 ] && { echo -e "${RED}Execute com sudo: sudo bash install.sh${NC}"; exit 1; }

# ========== DETECTAR MODO ==========
MODE="install"
CURRENT_VERSION=""
if [ -f "$DIR/server.js" ]; then
  MODE="update"
  CURRENT_VERSION=$(grep -o '"version":"[^"]*"' "$DIR/package.json" 2>/dev/null | head -1 | cut -d'"' -f4)
  echo -e "${YELLOW}[INFO]${NC} Instalação existente detectada (v${CURRENT_VERSION:-?})"
  echo -e "${YELLOW}[INFO]${NC} Modo: ATUALIZAÇÃO"
else
  echo -e "${BLUE}[INFO]${NC} Modo: INSTALAÇÃO NOVA"
fi

# ========== VERIFICAR NODE.JS ==========
echo -e "${BLUE}[1/8]${NC} Verificando Node.js..."
if ! command -v node &>/dev/null; then
  echo -e "${YELLOW}[INFO]${NC} Node.js não encontrado. Instalando..."
  curl -fsSL https://deb.nodesource.com/setup_20.x | bash - > /dev/null 2>&1
  apt-get install -y nodejs > /dev/null 2>&1
fi
NODE_VERSION=$(node -v | sed 's/v//' | cut -d. -f1)
if [ "$NODE_VERSION" -lt "$REQUIRED_NODE_MAJOR" ]; then
  echo -e "${RED}[ERRO]${NC} Node.js $REQUIRED_NODE_MAJOR+ necessário (atual: $NODE_VERSION)"
  exit 1
fi
echo -e "${GREEN}[  OK]${NC} Node.js $(node -v)"

# ========== VERIFICAR NGINX ==========
echo -e "${BLUE}[2/8]${NC} Verificando Nginx..."
if ! command -v nginx &>/dev/null; then
  echo -e "${YELLOW}[INFO]${NC} Instalando Nginx..."
  apt-get install -y nginx > /dev/null 2>&1
fi
echo -e "${GREEN}[  OK]${NC} Nginx instalado"

# ========== BAIXAR VERSÃO MAIS RECENTE ==========
echo -e "${BLUE}[3/8]${NC} Baixando versão mais recente..."
TMPDIR=$(mktemp -d)
cd "$TMPDIR"

curl -sSL "$BASE_URL/latest.json" -o latest.json 2>/dev/null || { echo -e "${RED}[ERRO]${NC} Não foi possível conectar ao servidor de releases"; exit 1; }
NEW_VERSION=$(grep -o '"version": *"[^"]*"' latest.json | cut -d'"' -f4)
echo -e "${GREEN}[  OK]${NC} Versão disponível: v${NEW_VERSION}"

if [ "$MODE" = "update" ] && [ "$CURRENT_VERSION" = "$NEW_VERSION" ]; then
  echo -e "${GREEN}[INFO]${NC} Já está na versão mais recente (v${NEW_VERSION})"
  echo -e "${YELLOW}Deseja reinstalar mesmo assim? (s/N)${NC}"
  read -r resp
  if [ "$resp" != "s" ] && [ "$resp" != "S" ]; then
    rm -rf "$TMPDIR"
    exit 0
  fi
fi

curl -sSL "$BASE_URL/server.js" -o server.js 2>/dev/null || { echo -e "${RED}[ERRO]${NC} Falha ao baixar server.js"; exit 1; }
curl -sSL "$BASE_URL/App.jsx" -o App.jsx 2>/dev/null || { echo -e "${RED}[ERRO]${NC} Falha ao baixar App.jsx"; exit 1; }
echo -e "${GREEN}[  OK]${NC} Arquivos baixados"

# ========== BACKUP (se atualização) ==========
if [ "$MODE" = "update" ]; then
  echo -e "${BLUE}[4/8]${NC} Fazendo backup..."
  BACKUP="$DIR/backups/$(date +%Y%m%d_%H%M%S)"
  mkdir -p "$BACKUP"
  cp "$DIR/server.js" "$BACKUP/" 2>/dev/null || true
  cp -r "$DIR/admin-src" "$BACKUP/" 2>/dev/null || true
  cp "$DIR/licenses.db" "$BACKUP/" 2>/dev/null || true
  echo -e "${GREEN}[  OK]${NC} Backup em $BACKUP"
else
  echo -e "${BLUE}[4/8]${NC} Instalação nova — sem backup necessário"
fi

# ========== INSTALAR ARQUIVOS ==========
echo -e "${BLUE}[5/8]${NC} Instalando arquivos..."
mkdir -p "$DIR/admin-src"

# Copiar server.js
cp "$TMPDIR/server.js" "$DIR/server.js"

# Copiar App.jsx
cp "$TMPDIR/App.jsx" "$DIR/admin-src/App.jsx"

# Restaurar banco de dados se existir backup
if [ "$MODE" = "install" ] && [ -f "$HOME/licenses_backup.db" ]; then
  cp "$HOME/licenses_backup.db" "$DIR/licenses.db"
  echo -e "${GREEN}[  OK]${NC} Banco de dados restaurado do backup"
fi

# Criar package.json
cat > "$DIR/package.json" << 'PKGJSON'
{"name":"libernet-licenses","version":"2.0.0","scripts":{"start":"node server.js","build":"vite build"},"dependencies":{"better-sqlite3":"^11.0.0","cors":"^2.8.5","express":"^4.18.2","nodemailer":"^8.0.1"},"devDependencies":{"vite":"^5.4.0","@vitejs/plugin-react":"^4.3.0","react":"^18.3.0","react-dom":"^18.3.0"}}
PKGJSON
# Atualizar versão no package.json
sed -i "s/\"version\":\"2.0.0\"/\"version\":\"$NEW_VERSION\"/" "$DIR/package.json"

# Criar vite.config.js
cat > "$DIR/vite.config.js" << 'VITE'
import{defineConfig}from'vite';import react from'@vitejs/plugin-react';
export default defineConfig({plugins:[react()],root:'admin-src',build:{outDir:'../public',emptyOutDir:true}})
VITE

# Criar admin-src/main.jsx
cat > "$DIR/admin-src/main.jsx" << 'MAIN'
import{createRoot}from"react-dom/client";
import App from"./App.jsx";
createRoot(document.getElementById("root")).render(<App/>);
MAIN

# Criar admin-src/index.html
cat > "$DIR/admin-src/index.html" << 'HTML'
<!DOCTYPE html><html lang="pt-BR"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1.0"/><title>Libernet — Licenças</title></head><body><div id="root"></div><script type="module" src="./main.jsx"></script></body></html>
HTML

echo -e "${GREEN}[  OK]${NC} Arquivos instalados"

# ========== INSTALAR DEPENDÊNCIAS E COMPILAR ==========
echo -e "${BLUE}[6/8]${NC} Instalando dependências e compilando..."
cd "$DIR"
npm install > /dev/null 2>&1
npm run build > /dev/null 2>&1
echo -e "${GREEN}[  OK]${NC} Dependências instaladas e painel compilado"

# ========== CRIAR SERVIÇO SYSTEMD ==========
echo -e "${BLUE}[7/8]${NC} Configurando serviço..."
cat > "/etc/systemd/system/$SERVICE.service" << EOF
[Unit]
Description=Libernet License Server
After=network.target

[Service]
Type=simple
WorkingDirectory=$DIR
ExecStart=/usr/bin/node server.js
Restart=on-failure
RestartSec=5
Environment=PORT=4000
Environment=ADMIN_TOKEN=$(openssl rand -hex 24)

[Install]
WantedBy=multi-user.target
EOF

# Manter override.conf se existir (Asaas, SMTP)
if [ -f "/etc/systemd/system/genieacs-licenses.service.d/override.conf" ]; then
  mkdir -p "/etc/systemd/system/$SERVICE.service.d"
  cp "/etc/systemd/system/genieacs-licenses.service.d/override.conf" "/etc/systemd/system/$SERVICE.service.d/override.conf"
  echo -e "${GREEN}[  OK]${NC} Configurações Asaas/SMTP preservadas"
elif [ -f "/etc/systemd/system/$SERVICE.service.d/override.conf" ]; then
  echo -e "${GREEN}[  OK]${NC} Configurações Asaas/SMTP existentes mantidas"
else
  mkdir -p "/etc/systemd/system/$SERVICE.service.d"
  cat > "/etc/systemd/system/$SERVICE.service.d/override.conf" << 'OVERRIDE'
[Service]
# Asaas (descomente e configure)
#Environment=ASAAS_API_KEY=sua_chave_aqui
#Environment=ASAAS_ENV=sandbox
#Environment=ASAAS_WEBHOOK_TOKEN=seu_token
# SMTP (descomente e configure)
#Environment=SMTP_HOST=mail.exemplo.com
#Environment=SMTP_PORT=587
#Environment=SMTP_USER=email@exemplo.com
#Environment=SMTP_PASS=sua_senha
#Environment=SMTP_FROM=email@exemplo.com
OVERRIDE
  echo -e "${YELLOW}[INFO]${NC} Configure Asaas/SMTP em: systemctl edit $SERVICE"
fi

# Configurar Nginx (se instalação nova)
if [ "$MODE" = "install" ]; then
  cat > /etc/nginx/sites-available/libernet-licenses << 'NGINX'
server {
    listen 80 default_server;
    server_name _;
    location / {
        proxy_pass http://127.0.0.1:4000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
NGINX
  ln -sf /etc/nginx/sites-available/libernet-licenses /etc/nginx/sites-enabled/default 2>/dev/null || true
  nginx -t > /dev/null 2>&1 && systemctl reload nginx
fi

# Criar comando de atualização global
cat > /usr/local/bin/libernet-update << 'UPDATER'
#!/bin/bash
echo "Libernet License Server — Atualizador"
curl -sSL https://saas.libernet.com.br/instalador/serverlicense/install.sh | sudo bash
UPDATER
chmod +x /usr/local/bin/libernet-update

systemctl daemon-reload
systemctl enable "$SERVICE" > /dev/null 2>&1
systemctl restart "$SERVICE"
echo -e "${GREEN}[  OK]${NC} Serviço configurado e iniciado"

# ========== VERIFICAR ==========
echo -e "${BLUE}[8/8]${NC} Verificando..."
sleep 3
if systemctl is-active --quiet "$SERVICE"; then
  echo -e "${GREEN}[  OK]${NC} Servidor rodando na porta 4000"
else
  echo -e "${RED}[ERRO]${NC} Servidor não iniciou. Verifique: journalctl -u $SERVICE -n 20"
fi

# Limpar
rm -rf "$TMPDIR"

IP=$(hostname -I | awk '{print $1}')
echo ""
echo -e "${GREEN}${BOLD}═══════════════════════════════════════════════════${NC}"
echo -e "${GREEN}${BOLD}  Libernet License Server v${NEW_VERSION} — $([ "$MODE" = "update" ] && echo "Atualizado" || echo "Instalado")!${NC}"
echo -e "${GREEN}${BOLD}═══════════════════════════════════════════════════${NC}"
echo ""
echo -e "  ${BOLD}Acesso:${NC}  http://${IP}"
echo -e "  ${BOLD}Login:${NC}   admin / admin123"
echo ""
echo -e "  ${BOLD}Produtos padrão:${NC}"
echo -e "    RouterACS (RA-) — Gerenciamento TR-069"
echo -e "    BQN Pro (BQ-)   — Otimização de Rede"
echo -e "    BI ISP (BI-)    — Business Intelligence"
echo ""
echo -e "  ${BOLD}Comandos:${NC}"
echo -e "    sudo libernet-update        — Atualizar para última versão"
echo -e "    systemctl status $SERVICE   — Ver status"
echo -e "    journalctl -u $SERVICE -f   — Ver logs"
echo -e "    systemctl edit $SERVICE     — Configurar Asaas/SMTP"
echo ""
if [ "$MODE" = "update" ]; then
  echo -e "  ${BOLD}Changelog:${NC}"
  grep -o '"v[^"]*"' "$TMPDIR/latest.json" 2>/dev/null | tr -d '"' | while read line; do echo "    $line"; done || true
fi
echo ""
