#!/usr/bin/env bash
# Instala ou atualiza o Soares Leilões num servidor Ubuntu/Debian (VPS).
#
#   Dentro da pasta extraída do zip:
#     sudo bash deploy/instalar.sh soaresleiloesjudiciais.com.br
#
# Primeira vez: instala Node.js 24 + Caddy (HTTPS automático), cria o serviço e
#               gera uma senha nova para o painel (aparece no final).
# Rodar de novo com um zip mais novo: ATUALIZA só o código. Banco, imagens, lances,
#               cadastros e .env do servidor são mantidos (e é feito um backup antes).
set -euo pipefail

DESTINO=/opt/soares-leiloes
USUARIO=soares
SERVICO=soares-leiloes
PORTA=3000

DOMINIO="${1:-}"
if [ -z "$DOMINIO" ]; then read -rp "Domínio do site (ex.: soaresleiloesjudiciais.com.br): " DOMINIO; fi
DOMINIO="${DOMINIO#http://}"; DOMINIO="${DOMINIO#https://}"; DOMINIO="${DOMINIO%%/*}"; DOMINIO="${DOMINIO#www.}"
DOMINIO="$(echo "$DOMINIO" | tr 'A-Z' 'a-z')"
if ! [[ "$DOMINIO" =~ ^[a-z0-9.-]+\.[a-z]{2,}$ ]]; then echo "Domínio inválido: '$DOMINIO'"; exit 1; fi
if [ "$(id -u)" != 0 ]; then echo "Rode com sudo:  sudo bash deploy/instalar.sh $DOMINIO"; exit 1; fi

ORIGEM="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
if [ ! -f "$ORIGEM/server/index.js" ]; then echo "Rode este script de dentro da pasta extraída do zip."; exit 1; fi

passo() { printf '\n\033[1;32m==> %s\033[0m\n' "$1"; }
aviso() { printf '\033[1;33m%s\033[0m\n' "$1"; }

# ------------------------------------------------------------ Pacotes do sistema
passo "Instalando pacotes do sistema"
export DEBIAN_FRONTEND=noninteractive
apt-get update -qq
apt-get install -y -qq curl ca-certificates gnupg rsync >/dev/null

if ! command -v node >/dev/null || [ "$(node -p 'process.versions.node.split(".")[0]')" -lt 24 ]; then
  passo "Instalando Node.js 24"
  curl -fsSL https://deb.nodesource.com/setup_24.x | bash - >/dev/null
  apt-get install -y -qq nodejs >/dev/null
fi
echo "Node.js $(node -v)"

USAR_CADDY=1
if systemctl is-active --quiet nginx 2>/dev/null || systemctl is-active --quiet apache2 2>/dev/null; then
  USAR_CADDY=0
  aviso "Este servidor já tem Nginx/Apache rodando — o Caddy não será instalado."
  aviso "Configure o proxy HTTPS para 127.0.0.1:$PORTA conforme o README (seção Publicar na internet)."
elif ! command -v caddy >/dev/null; then
  passo "Instalando Caddy (HTTPS automático)"
  apt-get install -y -qq debian-keyring debian-archive-keyring apt-transport-https >/dev/null
  curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --batch --yes --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
  curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' > /etc/apt/sources.list.d/caddy-stable.list
  chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg /etc/apt/sources.list.d/caddy-stable.list
  apt-get update -qq
  apt-get install -y -qq caddy >/dev/null
fi

# ------------------------------------------------------------ Usuário e arquivos
id -u "$USUARIO" >/dev/null 2>&1 || useradd --system --home-dir "$DESTINO" --shell /usr/sbin/nologin "$USUARIO"
mkdir -p "$DESTINO"

ATUALIZACAO=0
[ -f "$DESTINO/data/soares.db" ] && ATUALIZACAO=1

if [ "$ATUALIZACAO" = 1 ]; then
  passo "Atualizando o código (banco, imagens e .env do servidor são mantidos)"
  (cd "$DESTINO" && runuser -u "$USUARIO" -- node --disable-warning=ExperimentalWarning scripts/backup.js) || aviso "Não consegui fazer o backup automático."
  if [ "$ORIGEM" != "$DESTINO" ]; then
    rsync -a --delete --exclude '/data/' --exclude '/.env' --exclude '/node_modules/' --exclude '/.build/' --exclude '/.astro/' "$ORIGEM/" "$DESTINO/"
  fi
else
  passo "Copiando o site para $DESTINO"
  if [ "$ORIGEM" != "$DESTINO" ]; then
    rsync -a --exclude '/node_modules/' --exclude '/.build/' --exclude '/.astro/' "$ORIGEM/" "$DESTINO/"
  fi
fi

if [ ! -f "$DESTINO/.env" ]; then
  cat > "$DESTINO/.env" <<EOF
# Gerado pelo instalador em $(date '+%d/%m/%Y %H:%M'). Veja .env.example para as outras opções.
PORT=$PORTA
HOST=127.0.0.1
SITE_URL=https://$DOMINIO
NODE_ENV=production
EOF
fi

passo "Instalando dependências (npm ci)"
(cd "$DESTINO" && npm ci --omit=dev --no-audit --no-fund --loglevel=error)

chown -R "$USUARIO:$USUARIO" "$DESTINO"
chmod 750 "$DESTINO" "$DESTINO/data"
chmod 600 "$DESTINO/.env"

SENHA_INFO=""
if [ "$ATUALIZACAO" = 0 ]; then
  SENHA_INFO="$(cd "$DESTINO" && runuser -u "$USUARIO" -- node --disable-warning=ExperimentalWarning scripts/senha-admin.js)"
fi

# ------------------------------------------------------------ Serviço (inicia sozinho e reinicia se cair)
passo "Configurando o serviço $SERVICO"
cat > "/etc/systemd/system/$SERVICO.service" <<EOF
[Unit]
Description=Soares Leilões (site + painel + lances)
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=$USUARIO
Group=$USUARIO
WorkingDirectory=$DESTINO
ExecStart=$(command -v node) --disable-warning=ExperimentalWarning server/index.js
Environment=NODE_ENV=production
Environment=ASTRO_TELEMETRY_DISABLED=1
Restart=always
RestartSec=3
# Proteções: o processo só consegue gravar dentro da pasta do site
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=$DESTINO

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable "$SERVICO" >/dev/null 2>&1
systemctl restart "$SERVICO"

passo "Gerando as páginas do site (leva alguns segundos)"
OK=0
for _ in $(seq 1 90); do
  if [ "$(curl -s -o /dev/null -w '%{http_code}' "http://127.0.0.1:$PORTA/")" = 200 ]; then OK=1; break; fi
  sleep 2
done
if [ "$OK" = 0 ]; then
  aviso "O site não respondeu a tempo. Veja o erro com:  journalctl -u $SERVICO -n 50"
  exit 1
fi

# ------------------------------------------------------------ HTTPS
if [ "$USAR_CADDY" = 1 ]; then
  passo "Configurando HTTPS para $DOMINIO"
  if [ -f /etc/caddy/Caddyfile ] && ! grep -q 'soares-leiloes' /etc/caddy/Caddyfile; then
    cp /etc/caddy/Caddyfile "/etc/caddy/Caddyfile.antes-soares-$(date +%Y%m%d%H%M)"
  fi
  cat > /etc/caddy/Caddyfile <<EOF
# soares-leiloes — gerado pelo instalador
$DOMINIO {
	reverse_proxy 127.0.0.1:$PORTA {
		flush_interval -1
	}
}

www.$DOMINIO {
	redir https://$DOMINIO{uri} permanent
}
EOF
  caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile >/dev/null
  systemctl enable caddy >/dev/null 2>&1
  systemctl reload caddy 2>/dev/null || systemctl restart caddy
fi

# Firewall: se o ufw estiver ligado, libera o acesso ao site (a porta $PORTA continua fechada)
if command -v ufw >/dev/null && ufw status 2>/dev/null | grep -q 'Status: active'; then
  ufw allow 80/tcp >/dev/null
  ufw allow 443/tcp >/dev/null
fi

echo
echo "=================================================================="
if [ "$ATUALIZACAO" = 1 ]; then
  echo " Site atualizado. Banco, imagens e senhas foram mantidos."
  echo " Backup do banco antes da atualização: $DESTINO/data/backups/"
else
  echo " Instalação concluída!"
  echo
  echo " Painel: https://$DOMINIO/admin/"
  echo "$SENHA_INFO" | sed 's/^/ /'
  echo
  echo " ANOTE A SENHA. Depois troque em Configurações › Minha senha."
  echo " Esqueceu? Gere outra:  cd $DESTINO && sudo -u $USUARIO npm run senha-admin"
  echo
  echo " Falta só apontar o domínio para este servidor (no registro.br ou onde"
  echo " o DNS estiver): registros A de $DOMINIO e www.$DOMINIO com o IP"
  echo " deste servidor (o mesmo que você usa para entrar por SSH)."
  echo " O cadeado HTTPS é emitido sozinho alguns minutos depois."
fi
echo
echo " Ver o que está acontecendo:  journalctl -u $SERVICO -f"
echo " Reiniciar:                   systemctl restart $SERVICO"
echo "=================================================================="
