#!/bin/bash
# ==============================================================================
# INSTALAÇÃO AUTOMATIZADA - LUBUNTU / UBUNTU 26.04
#
# Instala:
#   - OpenJDK 17
#   - Apache Tomcat 9
#   - Ungoogled-chrome
#   - AnyDesk
#   - net-tools
#   - bwm-ng
#   - htop
#   - OpenSSH Server
#   - atop
#   - Driver de touchscreen eGTouch (EETI / eGalaxTouch)
#   - devbvbs.war (implantado no Tomcat)
#   - Serviço devbvbs-update (roda update_devbvbs_linux.sh a cada boot)
#   - Proteção de tela/bloqueio/suspensão desabilitadas (kiosk)
#
# Compatibilidade:
#   - Ubuntu / Lubuntu 26.04
#   - Arquitetura amd64
#
# Tomcat:
#   - 9.0.122
#
# ==============================================================================

set -Eeuo pipefail

# ==============================================================================
# CONFIGURAÇÕES
# ==============================================================================

TOMCAT_VERSION="9.0.122"
TOMCAT_INSTALL_DIR="/opt/tomcat"
TOMCAT_USER="tomcat"
TOMCAT_GROUP="tomcat"

# Usuário usado para logar na sessão gráfica (kiosk). Além do usuário de
# serviço do Tomcat, esse usuário também precisa de acesso à porta serial
# (para ferramentas gráficas como o eGTouch Utility) e de sudo.
DESKTOP_USER="${SUDO_USER:-ubuntu}"

# Aplicação web que será aberta pelo atalho do menu e automaticamente após o
# login. Ajuste estes valores se o contexto da aplicação for diferente.
APP_NAME="devbvbs"
APP_URL="http://127.0.0.1:8080/devbvbs/"
APP_DESKTOP_FILE="devbvbs.desktop"
APP_ICON="chromium"

# Reinicia a máquina ao final da instalação. Altere para 0 caso queira
# reiniciar manualmente.
REBOOT_AT_END=1

# Memória do Tomcat
TOMCAT_XMS="1G"
TOMCAT_XMX="2G"

# Porta padrão
TOMCAT_PORT="8080"

# Diretórios temporários
TMP_DIR="/tmp/lubuntu-java-tomcat-install"

# URL oficial atual do Apache
TOMCAT_BASE_URL="https://updates.intra.devco.cloud/devbvbs/instalador_linux"
TOMCAT_FILE="apache-tomcat-${TOMCAT_VERSION}.tar.gz"
TOMCAT_URL="${TOMCAT_BASE_URL}/${TOMCAT_FILE}"
TOMCAT_SHA_URL="${TOMCAT_URL}.sha512"

# Driver de touchscreen eGTouch (EETI / eGalaxTouch)
EGTOUCH_VERSION="2.5.13219.L-x"
EGTOUCH_URL="https://updates.intra.devco.cloud/devbvbs/instalador_linux/eGTouch_v${EGTOUCH_VERSION}.7z"
EGTOUCH_INTERFACE="1"          # 1=RS232  2=USB  3=PS2
EGTOUCH_MULTI_MONITOR="N"      # Y/N - rotação de monitor / múltiplos monitores
EGTOUCH_CONTROLLER_COUNT="1"   # quantidade de controladores conectados
EGTOUCH_LOG="/var/log/egtouch-setup.log"

TOUCH_REBOOT_REQUIRED=0

# ==============================================================================
# CORES
# ==============================================================================

RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

# ==============================================================================
# FUNÇÕES
# ==============================================================================

info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

success() {
    echo -e "${GREEN}[SUCESSO]${NC} $1"
}

warn() {
    echo -e "${YELLOW}[ALERTA]${NC} $1"
}

error() {
    echo -e "${RED}[ERRO]${NC} $1"
    exit 1
}

section() {
    echo
    echo -e "${CYAN}==============================================================${NC}"
    echo -e "${CYAN}$1${NC}"
    echo -e "${CYAN}==============================================================${NC}"
}

# Tempo (em segundos) que o apt-get aguarda a liberação da lock do dpkg antes
# de desistir. Evita falha quando o unattended-upgrades (ou outro processo
# apt/dpkg) está rodando em paralelo, algo comum logo após o boot da VM.
APT_LOCK_TIMEOUT="300"

apt_get() {
    apt-get -o DPkg::Lock::Timeout="$APT_LOCK_TIMEOUT" "$@"
}

cleanup() {
    rm -rf "$TMP_DIR"
}

trap cleanup EXIT

# ==============================================================================
# TRATAMENTO DE ERROS
# ==============================================================================

trap 'error "Falha na linha $LINENO. Comando: $BASH_COMMAND"' ERR

# ==============================================================================
# 1. VERIFICAÇÃO DE ROOT
# ==============================================================================

section "VALIDAÇÃO DO AMBIENTE"

if [ "$EUID" -ne 0 ]; then
    error "Este script precisa ser executado como root ou através de sudo."
fi

info "Executando como root."

# ==============================================================================
# 2. VERIFICAR SISTEMA OPERACIONAL
# ==============================================================================

if [ ! -f /etc/os-release ]; then
    error "Não foi possível identificar o sistema operacional."
fi

source /etc/os-release

info "Sistema detectado: ${PRETTY_NAME}"

if [ "${ID:-}" != "ubuntu" ]; then
    warn "O sistema não parece ser Ubuntu/Lubuntu."
    warn "ID detectado: ${ID:-desconhecido}"
fi

if [ "${VERSION_ID:-}" != "26.04" ]; then
    warn "Este script foi preparado para Ubuntu/Lubuntu 26.04."
    warn "Versão detectada: ${VERSION_ID:-desconhecida}"
fi

# ==============================================================================
# 3. VERIFICAR ARQUITETURA
# ==============================================================================

ARCH="$(dpkg --print-architecture)"

info "Arquitetura detectada: ${ARCH}"

if [ "$ARCH" != "amd64" ]; then
    error "Este script suporta atualmente somente a arquitetura amd64."
fi

# ==============================================================================
# 5. PREPARAR DIRETÓRIO TEMPORÁRIO
# ==============================================================================

mkdir -p "$TMP_DIR"
chmod 700 "$TMP_DIR"

# ==============================================================================
# 6. SINCRONIZAR DATA E HORA
# ==============================================================================

section "SINCRONIZANDO DATA E HORA"

# O apt rejeita repositórios assinados quando o relógio da máquina está muito
# atrasado ou adiantado. Isto é comum em VMs recém-criadas ou sem bateria RTC.
info "Habilitando sincronização automática de data e hora (NTP)..."
timedatectl set-ntp true || warn "Não foi possível habilitar NTP pelo timedatectl."

if systemctl list-unit-files | grep -q '^systemd-timesyncd.service'; then
    systemctl restart systemd-timesyncd || true
fi

# Aguarda até 30 segundos pela primeira sincronização, sem travar a instalação
# caso o sistema use outro serviço NTP.
NTP_SYNCHRONIZED=""
for i in {1..30}; do
    NTP_SYNCHRONIZED="$(timedatectl show -p NTPSynchronized --value 2>/dev/null || true)"
    if [ "$NTP_SYNCHRONIZED" = "yes" ]; then
        break
    fi
    sleep 1
done

if [ "$NTP_SYNCHRONIZED" = "yes" ]; then
    success "Data e hora sincronizadas automaticamente."
else
    warn "Não foi possível confirmar a sincronização NTP agora."
    warn "Se o apt informar que um repositório 'não é válido até o momento', corrija a data/hora e execute o script novamente."
fi

info "Horário atual: $(date '+%Y-%m-%d %H:%M:%S %Z')"

# ==============================================================================
# 7. ATUALIZAR SISTEMA E INSTALAR FERRAMENTAS BÁSICAS
# ==============================================================================

section "ATUALIZANDO SISTEMA"

info "Atualizando índice de pacotes..."

apt_get update

info "Instalando ferramentas básicas..."

apt_get install -y \
    ca-certificates \
    curl \
    wget \
    gnupg \
    gpg \
    apt-transport-https \
    software-properties-common \
    desktop-file-utils \
    lsb-release \
    tar \
    gzip \
    openssl \
    onboard

success "Ferramentas básicas instaladas."

# ==============================================================================
# 7. INSTALAR FERRAMENTAS DE MONITORAMENTO E REDE
# ==============================================================================

section "INSTALANDO FERRAMENTAS DE REDE E MONITORAMENTO"

info "Instalando:"
echo
echo "  - net-tools"
echo "  - bwm-ng"
echo "  - htop"
echo "  - openssh-server"
echo "  - atop"
echo

apt_get install -y \
    net-tools \
    bwm-ng \
    htop \
    openssh-server \
    atop

success "Ferramentas de rede e monitoramento instaladas."

# ==============================================================================
# 8. CONFIGURAR SSH
# ==============================================================================

section "CONFIGURANDO SSH"

if systemctl list-unit-files | grep -q "^ssh.service"; then
    systemctl enable ssh
    systemctl restart ssh

    if systemctl is-active --quiet ssh; then
        success "OpenSSH Server está ativo."
    else
        warn "OpenSSH Server foi instalado, mas não está ativo."
    fi
else
    warn "Não foi encontrado o serviço ssh.service."
fi

# ==============================================================================
# 10. INSTALAR JAVA 17
# ==============================================================================

section "INSTALANDO OPENJDK 17"

sudo mkdir -p /etc/apt/keyrings
wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo tee /etc/apt/keyrings/adoptium.asc > /dev/null
echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | sudo tee /etc/apt/sources.list.d/adoptium.list

sudo apt update
sudo apt install -y temurin-17-jdk
sudo apt-mark hold temurin-17-jdk

# Verificar Java
if ! command -v java >/dev/null 2>&1; then
    error "Java não foi encontrado após a instalação."
fi

JAVA_VERSION="$(java -version 2>&1 | head -n 1)"

info "Java instalado:"
echo "    ${JAVA_VERSION}"

# Detectar JAVA_HOME
JAVA_BIN_PATH="$(readlink -f "$(command -v java)")"
JAVA_HOME_DIR="$(dirname "$(dirname "$JAVA_BIN_PATH")")"

info "JAVA_HOME detectado:"
echo "    ${JAVA_HOME_DIR}"

if [ ! -x "${JAVA_HOME_DIR}/bin/java" ]; then
    error "JAVA_HOME detectado não parece ser válido: ${JAVA_HOME_DIR}"
fi

# ==============================================================================
# 11. CONFIGURAR JAVA_HOME GLOBAL
# ==============================================================================

section "CONFIGURANDO JAVA_HOME"

cat > /etc/profile.d/jdk.sh <<EOF
# OpenJDK 17
export JAVA_HOME="${JAVA_HOME_DIR}"
export PATH="\$JAVA_HOME/bin:\$PATH"
EOF

chmod 644 /etc/profile.d/jdk.sh

# Tornar disponível neste processo
export JAVA_HOME="$JAVA_HOME_DIR"
export PATH="$JAVA_HOME/bin:$PATH"

success "JAVA_HOME configurado em /etc/profile.d/jdk.sh"

# ==============================================================================
# 12. INSTALAR GOOGLE CHROME
# ==============================================================================

section "INSTALANDO Ungoogled Chromium"

info "Adicionando repositório do Ungoogled Chromium sem perguntas interativas..."

# -y aceita a confirmação normalmente solicitada pelo add-apt-repository.
add-apt-repository -y ppa:xtradeb/apps
apt_get update

info "Instalando Ungoogled Chromium..."

# -y aceita a confirmação normalmente solicitada pelo apt.
apt_get install -y ungoogled-chromium

if command -v ungoogled-chromium >/dev/null 2>&1; then
    CHROMIUM_VERSION="$(ungoogled-chromium --version 2>/dev/null || true)"
    success "Ungoogled Chromium instalado: ${CHROMIUM_VERSION}"
else
    warn "Ungoogled Chromium não foi localizado no PATH após a instalação."
fi

# ==============================================================================
# 13. CONFIGURAR ANYDESK
# ==============================================================================

section "INSTALANDO ANYDESK"

ANYDESK_KEY="/etc/apt/keyrings/anydesk.gpg"

info "Baixando chave GPG do AnyDesk..."

curl -fsSL \
    https://keys.anydesk.com/repos/DEB-GPG-KEY \
    | gpg --dearmor --yes -o "$ANYDESK_KEY"

chmod 644 "$ANYDESK_KEY"

cat > /etc/apt/sources.list.d/anydesk-stable.list <<EOF
deb [arch=amd64 signed-by=${ANYDESK_KEY}] https://deb.anydesk.com/ all main
EOF

apt_get update

info "Instalando AnyDesk..."

apt_get install -y anydesk

if command -v anydesk >/dev/null 2>&1; then
    ANYDESK_VERSION="$(anydesk --version 2>/dev/null || true)"
    success "AnyDesk instalado: ${ANYDESK_VERSION}"
else
    warn "AnyDesk não foi localizado no PATH."
fi

# ==============================================================================
# 13B. INSTALAR DRIVER DE TOUCHSCREEN (eGTouch / eGalaxTouch)
# ==============================================================================

section "INSTALANDO DRIVER DE TOUCHSCREEN (eGTouch)"

EGTOUCH_TMP="${TMP_DIR}/egtouch"
mkdir -p "$EGTOUCH_TMP"

EGTOUCH_ARCHIVE="${EGTOUCH_TMP}/eGTouch_v${EGTOUCH_VERSION}.7z"
EGTOUCH_EXTRACT_DIR="${EGTOUCH_TMP}/eGTouch_v${EGTOUCH_VERSION}"

if command -v eGTouchD >/dev/null 2>&1 || [ -d "/usr/local/eGTouch64withX" ]; then

    warn "O driver eGTouch já parece estar instalado neste sistema."
    warn "Instalação do driver de touchscreen ignorada."

else

    info "Instalando dependência para extrair o pacote .7z (pacote 7zip)..."

    apt_get install -y 7zip

    info "Baixando driver eGTouch v${EGTOUCH_VERSION}..."

    curl -fL \
        "$EGTOUCH_URL" \
        -o "$EGTOUCH_ARCHIVE"

    if [ ! -s "$EGTOUCH_ARCHIVE" ]; then
        error "Arquivo do driver eGTouch foi baixado vazio."
    fi

    success "Driver eGTouch baixado."

    info "Extraindo pacote..."

    7z x -y -o"${EGTOUCH_TMP}" "$EGTOUCH_ARCHIVE" >/dev/null

    if [ ! -f "${EGTOUCH_EXTRACT_DIR}/setup.sh" ]; then
        error "setup.sh não foi encontrado após a extração do driver eGTouch."
    fi

    chmod +x "${EGTOUCH_EXTRACT_DIR}/setup.sh"

    info "Executando instalador do driver (respostas automáticas às perguntas interativas)..."

    # Sequência de respostas, na ordem em que o setup.sh pergunta (mapeada a
    # partir de uma instalação manual real):
    #   1) Aceite da declaração de patente            -> Y
    #   2) Interface do controlador (RS232/USB/PS2)   -> $EGTOUCH_INTERFACE
    #   3) Confirmação de que o touch está conectado  -> [Enter]
    #   4) Rotação de monitor / múltiplos monitores   -> $EGTOUCH_MULTI_MONITOR
    #   5) Quantidade de controladores                -> $EGTOUCH_CONTROLLER_COUNT
    #
    # ATENÇÃO: essa sequência foi mapeada a partir de UMA execução manual.
    # Se a versão do driver, o hardware conectado ou o ambiente gráfico
    # detectado forem diferentes, o instalador pode fazer perguntas extras ou
    # em outra ordem, e a automação abaixo pode não cobrir esse caso. Revise
    # o log em "${EGTOUCH_LOG}" na primeira execução em cada modelo de imagem.

    set +e
    (
        cd "$EGTOUCH_EXTRACT_DIR" || exit 1
        printf 'Y\n%s\n\n%s\n%s\n' \
            "$EGTOUCH_INTERFACE" \
            "$EGTOUCH_MULTI_MONITOR" \
            "$EGTOUCH_CONTROLLER_COUNT" \
            | bash ./setup.sh
    ) | tee "$EGTOUCH_LOG"
    EGTOUCH_INSTALL_STATUS="${PIPESTATUS[0]:-$?}"
    set -e

    if command -v eGTouchD >/dev/null 2>&1; then
        success "Driver eGTouch instalado."
        TOUCH_REBOOT_REQUIRED=1
    else
        warn "O instalador rodou (status ${EGTOUCH_INSTALL_STATUS}), mas eGTouchD não foi encontrado no PATH."
        warn "Verifique o log em ${EGTOUCH_LOG} e confira se a sequência de perguntas bateu com a esperada."
    fi

fi

# ==============================================================================
# ==============================================================================
# 13C. DESABILITAR NOTIFICAÇÕES DE ATUALIZAÇÃO DO LUBUNTU
# ==============================================================================

section "DESABILITANDO NOTIFICAÇÕES DE ATUALIZAÇÃO"

# Esta máquina funciona como kiosk/terminal dedicado.
# O objetivo aqui é impedir que o desktop exiba avisos do Update Manager /
# Update Notifier e que o unattended-upgrades fique alterando o sistema
# automaticamente.
#
# IMPORTANTE:
#   - apt/apt-get continua disponível para manutenção manual.
#   - o script de atualização do devbvbs NÃO é afetado.
#   - não removemos os repositórios APT.
#   - atualizações podem ser feitas manualmente quando necessário.

info "Desabilitando atualizações automáticas e notificações do desktop..."

# Desabilitar o serviço de atualizações automáticas, quando instalado.
if systemctl list-unit-files 2>/dev/null | grep -q '^unattended-upgrades.service'; then
    systemctl disable --now unattended-upgrades.service 2>/dev/null || true
    success "unattended-upgrades.service desabilitado."
fi

# Impedir que o APT inicie o unattended-upgrades automaticamente.
cat > /etc/apt/apt.conf.d/99-devbvbs-kiosk-no-auto-updates <<'EOF'
// DevBVBS Kiosk - não executar atualizações automáticas.
// Atualizações do sistema são feitas manualmente pelo administrador.

APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Download-Upgradeable-Packages "0";
APT::Periodic::AutocleanInterval "0";
APT::Periodic::Unattended-Upgrade "0";
EOF

chmod 644 /etc/apt/apt.conf.d/99-devbvbs-kiosk-no-auto-updates

# Desabilitar timers periódicos do APT, se existirem.
systemctl disable --now apt-daily.timer 2>/dev/null || true
systemctl disable --now apt-daily-upgrade.timer 2>/dev/null || true

# Evitar que o Update Manager / Update Notifier seja executado no login
# do usuário gráfico.
if id "$DESKTOP_USER" >/dev/null 2>&1; then

    UPDATE_AUTOSTART_DIR="/etc/xdg/autostart"

    # Ubuntu/Lubuntu pode ter diferentes componentes conforme a imagem.
    # Usamos Hidden=true para desabilitar o autostart sem apagar os arquivos
    # fornecidos pelos pacotes.
    for desktop_file in \
        update-notifier.desktop \
        update-manager.desktop \
        update-manager-update.desktop
    do
        if [ -f "${UPDATE_AUTOSTART_DIR}/${desktop_file}" ]; then
            cat > "${UPDATE_AUTOSTART_DIR}/${desktop_file}" <<EOF
[Desktop Entry]
Type=Application
Name=${desktop_file}
Hidden=true
X-GNOME-Autostart-enabled=false
X-LXQt-Autostart-enabled=false
EOF
            chmod 644 "${UPDATE_AUTOSTART_DIR}/${desktop_file}"
            success "Autostart desabilitado: ${desktop_file}"
        fi
    done

    # Também bloqueia possíveis autostarts específicos do usuário.
    DESKTOP_USER_HOME="$(getent passwd "$DESKTOP_USER" | cut -d: -f6)"
    USER_UPDATE_AUTOSTART_DIR="${DESKTOP_USER_HOME}/.config/autostart"

    mkdir -p "$USER_UPDATE_AUTOSTART_DIR"
    chown "$DESKTOP_USER":"$(id -gn "$DESKTOP_USER")" "$USER_UPDATE_AUTOSTART_DIR"

    for desktop_file in \
        update-notifier.desktop \
        update-manager.desktop \
        update-manager-update.desktop
    do
        cat > "${USER_UPDATE_AUTOSTART_DIR}/${desktop_file}" <<EOF
[Desktop Entry]
Type=Application
Name=${desktop_file}
Hidden=true
X-GNOME-Autostart-enabled=false
X-LXQt-Autostart-enabled=false
EOF
        chmod 644 "${USER_UPDATE_AUTOSTART_DIR}/${desktop_file}"
        chown "$DESKTOP_USER":"$(id -gn "$DESKTOP_USER")" \
            "${USER_UPDATE_AUTOSTART_DIR}/${desktop_file}"
    done

    success "Autostarts de atualização desabilitados para ${DESKTOP_USER}."
fi

success "Notificações e atualizações automáticas do sistema desabilitadas."
warn "As atualizações do Ubuntu/Lubuntu deverão ser feitas manualmente pelo administrador."

# 13C. DESABILITAR PROTEÇÃO DE TELA, BLOQUEIO, SUSPENSÃO E XSCREENSAVER
# ==============================================================================

section "DESABILITANDO PROTEÇÃO DE TELA, BLOQUEIO, SUSPENSÃO E XSCREENSAVER"

# Máquina fica ligada por longos períodos sem uso (kiosk/touch) e não deve
# apagar a tela, iniciar screensaver, travar pedindo senha ou suspender.

# ------------------------------------------------------------------------------
# Remover light-locker, se estiver instalado
# ------------------------------------------------------------------------------

if dpkg -l light-locker 2>/dev/null | grep -q "^ii"; then
    info "Removendo o pacote light-locker (bloqueio de tela)..."
    apt_get remove -y light-locker
    success "light-locker removido."
else
    info "light-locker não está instalado. Nada a remover."
fi

# ------------------------------------------------------------------------------
# Desabilitar/remover XScreenSaver
# ------------------------------------------------------------------------------

info "Verificando XScreenSaver..."

XSCREENSAVER_PACKAGES=()

for pkg in \
    xscreensaver \
    xscreensaver-data \
    xscreensaver-gl \
    xscreensaver-gl-extra
do
    if dpkg-query -W -f='${Status}' "$pkg" 2>/dev/null | grep -q "install ok installed"; then
        XSCREENSAVER_PACKAGES+=("$pkg")
    fi
done

if [ "${#XSCREENSAVER_PACKAGES[@]}" -gt 0 ]; then
    info "Removendo pacotes XScreenSaver: ${XSCREENSAVER_PACKAGES[*]}"
    apt_get remove -y "${XSCREENSAVER_PACKAGES[@]}"
    success "XScreenSaver removido."
else
    info "Nenhum pacote XScreenSaver instalado."
fi

# Se houver uma instância antiga em execução, encerra.
if pgrep -x xscreensaver >/dev/null 2>&1; then
    info "Encerrando processo xscreensaver em execução..."
    pkill -x xscreensaver || true
    success "Processo xscreensaver encerrado."
fi

# ------------------------------------------------------------------------------
# Desabilitar qualquer autostart antigo do XScreenSaver para o usuário da sessão
# ------------------------------------------------------------------------------

if id "$DESKTOP_USER" >/dev/null 2>&1; then
    DESKTOP_USER_HOME="$(getent passwd "$DESKTOP_USER" | cut -d: -f6)"
    USER_AUTOSTART_DIR="${DESKTOP_USER_HOME}/.config/autostart"

    mkdir -p "$USER_AUTOSTART_DIR"
    chown "$DESKTOP_USER" "$USER_AUTOSTART_DIR"

    # Se o pacote tiver deixado um xscreensaver.desktop no autostart do usuário,
    # um arquivo Hidden=true com o mesmo nome desativa o autostart.
    cat > "${USER_AUTOSTART_DIR}/xscreensaver.desktop" <<'EOF'
[Desktop Entry]
Type=Application
Name=XScreenSaver
Hidden=true
X-GNOME-Autostart-enabled=false
X-LXQt-Autostart-enabled=false
EOF

    chmod 644 "${USER_AUTOSTART_DIR}/xscreensaver.desktop"
    chown "$DESKTOP_USER" "${USER_AUTOSTART_DIR}/xscreensaver.desktop"

    success "Autostart do XScreenSaver desabilitado para ${DESKTOP_USER}."
fi

# ------------------------------------------------------------------------------
# Desabilitar screensaver/DPMS do X11 a cada login
# ------------------------------------------------------------------------------

NO_SCREENSAVER_AUTOSTART="/etc/xdg/autostart/no-screensaver.desktop"

info "Criando autostart para desligar DPMS/screensaver do X11 em toda sessão gráfica..."

mkdir -p "$(dirname "$NO_SCREENSAVER_AUTOSTART")"

cat > "$NO_SCREENSAVER_AUTOSTART" <<'EOF'
[Desktop Entry]
Type=Application
Name=Desabilita protecao de tela
Comment=Desliga o DPMS e o screensaver do X11 (xset) a cada login
Exec=sh -c "xset s off; xset s noblank; xset -dpms"
NoDisplay=true
X-GNOME-Autostart-enabled=true
X-LXQt-Autostart-enabled=true
EOF

chmod 644 "$NO_SCREENSAVER_AUTOSTART"

success "Autostart criado em ${NO_SCREENSAVER_AUTOSTART}."

# ------------------------------------------------------------------------------
# Desabilitar DPMS também na tela de login (LightDM)
# ------------------------------------------------------------------------------

LIGHTDM_DPMS_DROPIN_DIR="/etc/lightdm/lightdm.conf.d"
LIGHTDM_DPMS_DROPIN="${LIGHTDM_DPMS_DROPIN_DIR}/50-disable-dpms.conf"

info "Desligando DPMS também na tela de login (lightdm)..."

mkdir -p "$LIGHTDM_DPMS_DROPIN_DIR"

cat > "$LIGHTDM_DPMS_DROPIN" <<'EOF'
[Seat:*]
xserver-command=X -s 0 dpms
EOF

chmod 644 "$LIGHTDM_DPMS_DROPIN"

success "DPMS da tela de login desligado (${LIGHTDM_DPMS_DROPIN})."

# ------------------------------------------------------------------------------
# Bloquear suspensão/hibernação no systemd
# ------------------------------------------------------------------------------

info "Bloqueando suspensão/hibernação no systemd..."

systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

success "Suspensão/hibernação bloqueadas (systemd mask)."

warn "Verifique no LXQt Power Manager (Preferências > LXQt Settings > Power Management)"
warn "se todos os timers de inatividade estão desabilitados. O script desabilita"
warn "screensaver/DPMS, mas o Power Manager do LXQt é um componente separado."

# 14. VERIFICAR SE JÁ EXISTE TOMCAT
# ==============================================================================

section "PREPARANDO APACHE TOMCAT"

if [ -d "$TOMCAT_INSTALL_DIR" ] && [ "$(find "$TOMCAT_INSTALL_DIR" -mindepth 1 -maxdepth 1 2>/dev/null | head -n 1)" ]; then

    warn "O diretório ${TOMCAT_INSTALL_DIR} já contém arquivos."

    if systemctl list-unit-files | grep -q "^tomcat.service"; then
        if systemctl is-active --quiet tomcat; then
            warn "O Tomcat atualmente está em execução."
            warn "Para evitar perda de dados/configurações, a instalação foi interrompida."
            error "Tomcat já instalado em ${TOMCAT_INSTALL_DIR}."
        fi
    fi

    error "Tomcat já possui uma instalação em ${TOMCAT_INSTALL_DIR}. Remova ou faça backup antes de continuar."

fi

# ==============================================================================
# 15. CRIAR USUÁRIO E GRUPO TOMCAT
# ==============================================================================

info "Criando grupo ${TOMCAT_GROUP}..."

if ! getent group "$TOMCAT_GROUP" >/dev/null 2>&1; then
    groupadd --system "$TOMCAT_GROUP"
    success "Grupo ${TOMCAT_GROUP} criado."
else
    info "Grupo ${TOMCAT_GROUP} já existe."
fi

info "Criando usuário ${TOMCAT_USER}..."

if ! getent passwd "$TOMCAT_USER" >/dev/null 2>&1; then
    useradd \
        --system \
        --gid "$TOMCAT_GROUP" \
        --home-dir "$TOMCAT_INSTALL_DIR" \
        --shell /usr/sbin/nologin \
        "$TOMCAT_USER"

    success "Usuário ${TOMCAT_USER} criado."
else
    info "Usuário ${TOMCAT_USER} já existe."
fi

# ==============================================================================
# 16. BAIXAR TOMCAT
# ==============================================================================

info "Versão do Tomcat:"
echo "    ${TOMCAT_VERSION}"

info "URL:"
echo "    ${TOMCAT_URL}"

TOMCAT_TAR="${TMP_DIR}/${TOMCAT_FILE}"
TOMCAT_SHA="${TMP_DIR}/${TOMCAT_FILE}.sha512"

info "Baixando Tomcat ${TOMCAT_VERSION}..."

curl -fL \
    "$TOMCAT_URL" \
    -o "$TOMCAT_TAR"

if [ ! -s "$TOMCAT_TAR" ]; then
    error "Arquivo do Tomcat foi baixado vazio."
fi

success "Tomcat baixado."

# ==============================================================================
# 17. VALIDAR SHA-512
# ==============================================================================

section "VALIDANDO INTEGRIDADE DO TOMCAT"

info "Baixando checksum SHA-512..."

curl -fL \
    "$TOMCAT_SHA_URL" \
    -o "$TOMCAT_SHA"

if [ ! -s "$TOMCAT_SHA" ]; then
    error "Não foi possível baixar o checksum SHA-512."
fi

EXPECTED_SHA="$(awk '{print $1}' "$TOMCAT_SHA")"

if [ -z "$EXPECTED_SHA" ]; then
    error "Não foi possível extrair o SHA-512 esperado."
fi

CALCULATED_SHA="$(sha512sum "$TOMCAT_TAR" | awk '{print $1}')"

info "SHA-512 esperado:"
echo "    ${EXPECTED_SHA}"

info "SHA-512 calculado:"
echo "    ${CALCULATED_SHA}"

if [ "$EXPECTED_SHA" != "$CALCULATED_SHA" ]; then
    error "Falha na validação SHA-512 do Tomcat."
fi

success "SHA-512 validado com sucesso."

# ==============================================================================
# 18. INSTALAR TOMCAT
# ==============================================================================

section "INSTALANDO TOMCAT"

mkdir -p "$TOMCAT_INSTALL_DIR"

info "Extraindo Tomcat em ${TOMCAT_INSTALL_DIR}..."

tar \
    -xzf "$TOMCAT_TAR" \
    -C "$TOMCAT_INSTALL_DIR" \
    --strip-components=1

success "Tomcat extraído."

# ==============================================================================
# 19. PREPARAR DIRETÓRIOS
# ==============================================================================

info "Preparando diretórios do Tomcat..."

mkdir -p \
    "${TOMCAT_INSTALL_DIR}/logs" \
    "${TOMCAT_INSTALL_DIR}/temp" \
    "${TOMCAT_INSTALL_DIR}/work" \
    "${TOMCAT_INSTALL_DIR}/webapps"

# ==============================================================================
# 20. REMOVER APLICAÇÕES DEMO PADRÃO
# ==============================================================================

info "Removendo aplicações de exemplo do Tomcat..."

rm -rf \
    "${TOMCAT_INSTALL_DIR}/webapps/docs" \
    "${TOMCAT_INSTALL_DIR}/webapps/examples" \
    "${TOMCAT_INSTALL_DIR}/webapps/host-manager" \
    "${TOMCAT_INSTALL_DIR}/webapps/manager"

# ==============================================================================
# 21. PERMISSÕES
# ==============================================================================

section "CONFIGURANDO PERMISSÕES DO TOMCAT"

chown -R "${TOMCAT_USER}:${TOMCAT_GROUP}" "$TOMCAT_INSTALL_DIR"

# Diretório principal
chmod 750 "$TOMCAT_INSTALL_DIR"

# Binários
chmod 750 "${TOMCAT_INSTALL_DIR}/bin"

# Configuração
chmod 750 "${TOMCAT_INSTALL_DIR}/conf"

# Garantir leitura dos arquivos de configuração
find "${TOMCAT_INSTALL_DIR}/conf" -type f -exec chmod 640 {} \;

# Logs / temporários / trabalho
chmod 750 "${TOMCAT_INSTALL_DIR}/logs"
chmod 750 "${TOMCAT_INSTALL_DIR}/temp"
chmod 750 "${TOMCAT_INSTALL_DIR}/work"
chmod 750 "${TOMCAT_INSTALL_DIR}/webapps"

# Scripts
chmod 750 "${TOMCAT_INSTALL_DIR}/bin/"*.sh

sed -i 's/protocol="HTTP\/1.1"/protocol="HTTP\/1.1" \
           compression="on" \
           compressionMinSize="2048" \
           compressableMimeType="text\/html,text\/xml,text\/plain,text\/css,text\/javascript,application\/javascript,application\/json" /g' \
    "${TOMCAT_INSTALL_DIR}/conf/server.xml"

success "Permissões configuradas."

# ==============================================================================
# 22. CONFIGURAR SYSTEMD
# ==============================================================================

section "CONFIGURANDO SERVIÇO SYSTEMD"

cat > /etc/systemd/system/tomcat.service <<EOF
[Unit]
Description=Apache Tomcat ${TOMCAT_VERSION}
Documentation=https://tomcat.apache.org/tomcat-9.0-doc/
After=network.target
Wants=network-online.target

[Service]
Type=simple

User=${TOMCAT_USER}
Group=${TOMCAT_GROUP}

Environment="JAVA_HOME=${JAVA_HOME_DIR}"
Environment="CATALINA_HOME=${TOMCAT_INSTALL_DIR}"
Environment="CATALINA_BASE=${TOMCAT_INSTALL_DIR}"
Environment="CATALINA_PID=${TOMCAT_INSTALL_DIR}/temp/tomcat.pid"

Environment="CATALINA_OPTS=-Xms${TOMCAT_XMS} -Xmx${TOMCAT_XMX} -Djava.awt.headless=true -XX:+UseG1GC -XX:+UseStringDeduplication -XX:MaxGCPauseMillis=150"
Environment="JAVA_OPTS=-Djava.security.egd=file:/dev/./urandom"

WorkingDirectory=${TOMCAT_INSTALL_DIR}

ExecStart=${TOMCAT_INSTALL_DIR}/bin/catalina.sh run
ExecStop=/bin/kill -15 \$MAINPID

Restart=on-failure
RestartSec=10

# Segurança básica
UMask=0027
NoNewPrivileges=true
PrivateTmp=true

# Limites
LimitNOFILE=65536
LimitNPROC=4096

[Install]
WantedBy=multi-user.target
EOF

chmod 644 /etc/systemd/system/tomcat.service

systemctl daemon-reload

systemctl enable tomcat

success "Serviço tomcat.service configurado."

# ==============================================================================
# 23. VALIDAR CONFIGURAÇÃO DO TOMCAT
# ==============================================================================

section "VALIDANDO CONFIGURAÇÃO DO TOMCAT"

if [ ! -x "${TOMCAT_INSTALL_DIR}/bin/catalina.sh" ]; then
    error "catalina.sh não foi encontrado ou não possui permissão de execução."
fi

info "Versão instalada:"

sudo -u "$TOMCAT_USER" \
    env JAVA_HOME="$JAVA_HOME_DIR" \
    CATALINA_HOME="$TOMCAT_INSTALL_DIR" \
    "${TOMCAT_INSTALL_DIR}/bin/catalina.sh" version || true

# ==============================================================================
# 24. INICIAR TOMCAT
# ==============================================================================

section "INICIANDO TOMCAT"

systemctl restart tomcat

info "Aguardando Tomcat iniciar..."

sleep 5

# ==============================================================================
# 25. VERIFICAR SERVIÇO
# ==============================================================================

if ! systemctl is-active --quiet tomcat; then

    echo
    warn "Tomcat não está ativo."
    echo

    systemctl status tomcat --no-pager -l || true

    echo
    info "Últimas linhas do log:"
    journalctl -u tomcat -n 50 --no-pager || true

    error "Falha ao iniciar o Tomcat."

fi

success "Tomcat está ativo."

# ==============================================================================
# 26. VERIFICAR PORTA 8080
# ==============================================================================

section "VALIDANDO PORTA ${TOMCAT_PORT}"

info "Verificando porta ${TOMCAT_PORT}..."

PORT_CHECK=0

for i in {1..15}; do

    if ss -lntp 2>/dev/null | grep -q ":${TOMCAT_PORT}"; then
        PORT_CHECK=1
        break
    fi

    sleep 1

done

if [ "$PORT_CHECK" -ne 1 ]; then

    warn "A porta ${TOMCAT_PORT} não foi detectada."

    info "Portas TCP em escuta:"
    ss -lntp || true

    error "Tomcat iniciou, mas não foi detectada a porta ${TOMCAT_PORT}."

fi

success "Tomcat está escutando na porta ${TOMCAT_PORT}."

# ==============================================================================
# 27. TESTAR HTTP
# ==============================================================================

section "TESTANDO HTTP DO TOMCAT"

HTTP_STATUS="$(curl \
    --silent \
    --output /dev/null \
    --write-out "%{http_code}" \
    --max-time 5 \
    "http://127.0.0.1:${TOMCAT_PORT}/" || true)"

if [[ "$HTTP_STATUS" =~ ^[0-9]{3}$ ]]; then
    success "Tomcat respondeu HTTP ${HTTP_STATUS}."
else
    warn "Não foi possível obter resposta HTTP do Tomcat."
fi

# ==============================================================================
# 28. STATUS DO ANYDESK
# ==============================================================================

section "VALIDANDO ANYDESK"

if systemctl list-unit-files | grep -q "^anydesk.service"; then

    systemctl enable anydesk || true
    systemctl restart anydesk || true

    if systemctl is-active --quiet anydesk; then
        success "AnyDesk está ativo."
    else
        warn "AnyDesk foi instalado, mas o serviço não está ativo."
    fi

else

    warn "Serviço anydesk.service não encontrado."

fi

# ==============================================================================
# 29. STATUS DO ATOP
# ==============================================================================

section "VALIDANDO ATOP"

if systemctl list-unit-files | grep -q "^atop.service"; then

    systemctl enable atop || true
    systemctl restart atop || true

    if systemctl is-active --quiet atop; then
        success "atop está ativo."
    else
        warn "atop está instalado, mas o serviço não está ativo."
    fi
else
    warn "Serviço atop.service não encontrado."
fi

# ==============================================================================
# 30. PERMISSÕES DE USUÁRIO (tomcat + sessão gráfica)
# ==============================================================================

section "CONFIGURANDO ACESSO A PORTAS SERIAIS E SUDO"

info "Adicionando usuário ${TOMCAT_USER} ao grupo dialout..."

usermod -aG dialout "$TOMCAT_USER"

success "Usuário ${TOMCAT_USER} adicionado ao grupo dialout."
info "Essa permissão só passa a valer para o processo do Tomcat depois de reiniciado o serviço (próximo passo cuida disso)."

if id "$DESKTOP_USER" >/dev/null 2>&1; then
    info "Adicionando usuário ${DESKTOP_USER} (sessão gráfica) aos grupos dialout e sudo..."
    usermod -aG dialout,sudo "$DESKTOP_USER"
    success "Usuário ${DESKTOP_USER} adicionado aos grupos dialout e sudo."
    info "Vale a partir do próximo login desse usuário (grupos são aplicados no login, não em sessões já abertas)."
else
    warn "Usuário ${DESKTOP_USER} não encontrado nesta máquina — pulando dialout/sudo para ele."
    warn "Se o login gráfico usa outro nome de usuário, ajuste a variável DESKTOP_USER no topo do script."
fi

# ==============================================================================
# 31. IMPLANTAR APLICAÇÃO devbvbs.war
# ==============================================================================

section "IMPLANTANDO devbvbs.war"

DEVBVBS_URL="https://updates.intra.devco.cloud/devbvbs/devbvbs-last.war"
DEVBVBS_WAR_TMP="${TMP_DIR}/devbvbs-last.war"
DEVBVBS_WAR_DEST="${TOMCAT_INSTALL_DIR}/webapps/devbvbs.war"

info "Baixando ${DEVBVBS_URL}..."

curl -fL \
    "$DEVBVBS_URL" \
    -o "$DEVBVBS_WAR_TMP"

if [ ! -s "$DEVBVBS_WAR_TMP" ]; then
    error "Arquivo devbvbs-last.war foi baixado vazio."
fi

success "devbvbs-last.war baixado."

info "Parando o serviço tomcat..."

systemctl stop tomcat

info "Copiando WAR para ${DEVBVBS_WAR_DEST}..."

cp "$DEVBVBS_WAR_TMP" "$DEVBVBS_WAR_DEST"
chown "${TOMCAT_USER}:${TOMCAT_GROUP}" "$DEVBVBS_WAR_DEST"
chmod 640 "$DEVBVBS_WAR_DEST"

success "devbvbs.war copiado para ${TOMCAT_INSTALL_DIR}/webapps/."

info "Iniciando o serviço tomcat (aplica também a permissão do grupo dialout)..."

systemctl start tomcat

info "Aguardando Tomcat iniciar..."
sleep 5

if ! systemctl is-active --quiet tomcat; then

    echo
    warn "Tomcat não está ativo após o deploy do devbvbs.war."
    echo

    systemctl status tomcat --no-pager -l || true

    echo
    info "Últimas linhas do log:"
    journalctl -u tomcat -n 50 --no-pager || true

    error "Falha ao iniciar o Tomcat após o deploy de devbvbs.war."

fi

success "Tomcat está ativo com devbvbs.war implantado e usuário ${TOMCAT_USER} no grupo dialout."

# ==============================================================================
# Configura timezone Ubuntu 24.04
# ==============================================================================

sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime
sudo echo "America/Sao_Paulo" > /etc/timezone
sudo dpkg-reconfigure -f noninteractive tzdata

# ==============================================================================
# 32. INSTALAR SCRIPT DE ATUALIZAÇÃO E RODAR A CADA BOOT
# ==============================================================================

section "INSTALANDO SCRIPT DE ATUALIZAÇÃO (devbvbs)"

UPDATE_SCRIPT_DIR="/opt/devbvbs"
UPDATE_SCRIPT_PATH="${UPDATE_SCRIPT_DIR}/update_devbvbs_linux.sh"
UPDATE_SERVICE_FILE="/etc/systemd/system/devbvbs-update.service"

info "Copiando update_devbvbs_linux.sh para ${UPDATE_SCRIPT_PATH}..."

mkdir -p "$UPDATE_SCRIPT_DIR"

cat > "$UPDATE_SCRIPT_PATH" <<'DEVBVBS_UPDATE_SCRIPT_EOF'

#!/bin/bash
# ==============================================================================
# ATUALIZAÇÃO DO devbvbs.war - Lubuntu / Ubuntu 26.04
#
# Verifica se há uma versão nova do devbvbs.war publicada (comparando o
# SHA-256 remoto com o hash do arquivo atualmente implantado em
# /opt/tomcat/webapps/devbvbs.war). Só baixa e reinicia o Tomcat se o hash
# for diferente.
#
# Fluxo:
#   1) Baixa o hash publicado (devbvbs-last.war.sha256)
#   2) Compara com o hash do devbvbs.war local
#      - se forem iguais: encerra sem tocar em nada
#   3) Se forem diferentes:
#      a) baixa o devbvbs-last.war
#      b) confere o hash do arquivo baixado (integridade do download)
#      c) para o tomcat
#      d) guarda um backup do .war antigo
#      e) substitui devbvbs.war
#      f) inicia o tomcat e valida se subiu
#
# Instalado por install_devbvbs_linux.sh em /opt/devbvbs/ e executado
# automaticamente a cada boot pelo serviço systemd devbvbs-update.service.
# Uso manual: sudo /opt/devbvbs/update_devbvbs_linux.sh
# ==============================================================================

set -Eeuo pipefail

# ==============================================================================
# CONFIGURAÇÕES
# ==============================================================================

TOMCAT_INSTALL_DIR="/opt/tomcat"
TOMCAT_USER="tomcat"
TOMCAT_GROUP="tomcat"

DEVBVBS_WAR_URL="https://updates.intra.devco.cloud/devbvbs/devbvbs-last.war"
DEVBVBS_SHA_URL="${DEVBVBS_WAR_URL}.sha256"

DEVBVBS_DEST="${TOMCAT_INSTALL_DIR}/webapps/devbvbs.war"

TMP_DIR="/tmp/devbvbs-update"

# Quantos backups antigos do .war manter (o mais recente + N anteriores)
KEEP_BACKUPS="5"

# Log persistente (não é apagado entre execuções, ao contrário do TMP_DIR)
LOG_FILE="/var/log/devbvbs-update.log"

# Tentativas e intervalo de espera para downloads. Existe principalmente
# para o caso de rodar logo no boot: a interface de rede pode estar "up"
# mas o DNS (principalmente domínio interno) ainda não responder por
# alguns segundos, mesmo com o serviço esperando o network-online.target.
CURL_MAX_RETRIES="20"
CURL_RETRY_DELAY="6"

# ==============================================================================
# CORES
# ==============================================================================

RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

# ==============================================================================
# FUNÇÕES
# ==============================================================================

log_to_file() {
    # Nunca deixa um problema ao gravar o log derrubar o script principal.
    echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "$LOG_FILE" 2>/dev/null || true
}

info() {
    echo -e "${BLUE}[INFO]${NC} $1"
    log_to_file "[INFO] $1"
}

success() {
    echo -e "${GREEN}[SUCESSO]${NC} $1"
    log_to_file "[SUCESSO] $1"
}

warn() {
    echo -e "${YELLOW}[ALERTA]${NC} $1"
    log_to_file "[ALERTA] $1"
}

error() {
    echo -e "${RED}[ERRO]${NC} $1"
    log_to_file "[ERRO] $1"
    exit 1
}

section() {
    echo
    echo -e "${CYAN}==============================================================${NC}"
    echo -e "${CYAN}$1${NC}"
    echo -e "${CYAN}==============================================================${NC}"
    log_to_file "== $1 =="
}

curl_retry() {
    local attempt=1
    while true; do
        if curl -fL --connect-timeout 10 "$@"; then
            return 0
        fi
        if [ "$attempt" -ge "$CURL_MAX_RETRIES" ]; then
            return 1
        fi
        warn "Falha ao acessar a rede (tentativa ${attempt}/${CURL_MAX_RETRIES}). Tentando de novo em ${CURL_RETRY_DELAY}s..."
        sleep "$CURL_RETRY_DELAY"
        attempt=$((attempt + 1))
    done
}

cleanup() {
    rm -rf "$TMP_DIR"
}

trap cleanup EXIT

# ==============================================================================
# TRATAMENTO DE ERROS
# ==============================================================================

trap 'error "Falha na linha $LINENO. Comando: $BASH_COMMAND"' ERR

# ==============================================================================
# 1. VALIDAÇÃO DO AMBIENTE
# ==============================================================================

section "VALIDAÇÃO DO AMBIENTE"

if [ "$EUID" -ne 0 ]; then
    error "Este script precisa ser executado como root ou através de sudo."
fi

info "Executando como root."

if [ ! -d "$TOMCAT_INSTALL_DIR" ]; then
    error "Diretório ${TOMCAT_INSTALL_DIR} não encontrado. O Tomcat está instalado nesta máquina?"
fi

TOMCAT_UNIT_FILE="/etc/systemd/system/tomcat.service"

if [ ! -f "$TOMCAT_UNIT_FILE" ]; then
    error "Unit do systemd não encontrada em ${TOMCAT_UNIT_FILE}. O Tomcat foi instalado nesta máquina pelo install_devbvbs_linux.sh?"
fi

info "Unit do Tomcat encontrada em ${TOMCAT_UNIT_FILE}."

mkdir -p "$TMP_DIR"

# ==============================================================================
# 2. VERIFICAR SE HÁ VERSÃO NOVA (hash remoto x hash local)
# ==============================================================================

section "VERIFICANDO VERSÃO DISPONÍVEL"

REMOTE_SHA_FILE="${TMP_DIR}/devbvbs-last.war.sha256"

info "Baixando hash publicado (${DEVBVBS_SHA_URL})..."

if ! curl_retry "$DEVBVBS_SHA_URL" -o "$REMOTE_SHA_FILE"; then
    error "Não consegui baixar ${DEVBVBS_SHA_URL} após ${CURL_MAX_RETRIES} tentativas (rede/DNS indisponível)."
fi

if [ ! -s "$REMOTE_SHA_FILE" ]; then
    error "Arquivo de hash (.sha256) foi baixado vazio."
fi

# Extrai só o hash (primeiro campo), aceita tanto "hash" sozinho quanto o
# formato padrão do sha256sum ("hash  nome-do-arquivo").
REMOTE_SHA="$(awk '{print $1}' "$REMOTE_SHA_FILE" | tr '[:upper:]' '[:lower:]')"

if [ -z "$REMOTE_SHA" ]; then
    error "Não foi possível interpretar o hash publicado em ${DEVBVBS_SHA_URL}."
fi

info "Hash publicado:  ${REMOTE_SHA}"

if [ -f "$DEVBVBS_DEST" ]; then
    LOCAL_SHA="$(sha256sum "$DEVBVBS_DEST" | awk '{print $1}' | tr '[:upper:]' '[:lower:]')"
    info "Hash local:      ${LOCAL_SHA}  (${DEVBVBS_DEST})"
else
    LOCAL_SHA=""
    warn "Nenhum devbvbs.war encontrado em ${DEVBVBS_DEST} ainda."
fi

if [ -n "$LOCAL_SHA" ] && [ "$LOCAL_SHA" = "$REMOTE_SHA" ]; then
    success "devbvbs.war já está na versão mais recente. Nada a fazer."
    log_to_file "RESULTADO=SEM_ATUALIZACAO hash=${REMOTE_SHA}"
    exit 0
fi

info "Versão diferente da publicada. Prosseguindo com a atualização."

# ==============================================================================
# 3. BAIXAR E VALIDAR O NOVO WAR
# ==============================================================================

section "BAIXANDO devbvbs-last.war"

DEVBVBS_WAR_TMP="${TMP_DIR}/devbvbs-last.war"

if ! curl_retry "$DEVBVBS_WAR_URL" -o "$DEVBVBS_WAR_TMP"; then
    error "Não consegui baixar ${DEVBVBS_WAR_URL} após ${CURL_MAX_RETRIES} tentativas (rede/DNS indisponível)."
fi

if [ ! -s "$DEVBVBS_WAR_TMP" ]; then
    error "Arquivo devbvbs-last.war foi baixado vazio."
fi

success "devbvbs-last.war baixado."

info "Validando integridade do arquivo baixado..."

DOWNLOADED_SHA="$(sha256sum "$DEVBVBS_WAR_TMP" | awk '{print $1}' | tr '[:upper:]' '[:lower:]')"

if [ "$DOWNLOADED_SHA" != "$REMOTE_SHA" ]; then
    error "Hash do arquivo baixado (${DOWNLOADED_SHA}) não confere com o hash publicado (${REMOTE_SHA}). Atualização abortada — o Tomcat não foi tocado."
fi

success "Hash confere. Arquivo íntegro."

# ==============================================================================
# 4. PARAR TOMCAT E SUBSTITUIR O WAR
# ==============================================================================

section "APLICANDO ATUALIZAÇÃO"

info "Parando o serviço tomcat..."

systemctl stop tomcat

if [ -f "$DEVBVBS_DEST" ]; then

    BACKUP_FILE="${DEVBVBS_DEST}.bak.$(date +%Y%m%d%H%M%S)"

    info "Guardando backup da versão anterior em ${BACKUP_FILE}..."

    cp "$DEVBVBS_DEST" "$BACKUP_FILE"

    # Mantém só os KEEP_BACKUPS backups mais recentes
    ls -1t "${DEVBVBS_DEST}.bak."* 2>/dev/null \
        | tail -n "+$((KEEP_BACKUPS + 1))" \
        | xargs -r rm -f

fi

info "Substituindo ${DEVBVBS_DEST}..."

cp "$DEVBVBS_WAR_TMP" "$DEVBVBS_DEST"
chown "${TOMCAT_USER}:${TOMCAT_GROUP}" "$DEVBVBS_DEST"
chmod 640 "$DEVBVBS_DEST"

success "devbvbs.war atualizado."

# ==============================================================================
# 5. INICIAR TOMCAT E VALIDAR
# ==============================================================================

info "Iniciando o serviço tomcat..."

systemctl start tomcat

info "Aguardando Tomcat iniciar..."
sleep 5

if ! systemctl is-active --quiet tomcat; then

    echo
    warn "Tomcat não está ativo após a atualização."
    echo

    systemctl status tomcat --no-pager -l || true

    echo
    info "Últimas linhas do log:"
    journalctl -u tomcat -n 50 --no-pager || true

    error "Falha ao iniciar o Tomcat após a atualização do devbvbs.war."

fi

success "Tomcat está ativo com devbvbs.war atualizado."

log_to_file "RESULTADO=ATUALIZADO hash_anterior=${LOCAL_SHA:-nenhum} hash_novo=${REMOTE_SHA}"

# ==============================================================================
# 6. RESUMO
# ==============================================================================

section "ATUALIZAÇÃO CONCLUÍDA"

echo
echo -e "${GREEN}Arquivo:${NC} ${DEVBVBS_DEST}"
echo -e "${GREEN}Hash:${NC}    ${REMOTE_SHA}"
echo -e "${GREEN}Tomcat:${NC}  $(systemctl is-active tomcat)"
echo -e "${GREEN}Log:${NC}     ${LOG_FILE}"
echo
DEVBVBS_UPDATE_SCRIPT_EOF

chmod 750 "$UPDATE_SCRIPT_PATH"
chown root:root "$UPDATE_SCRIPT_PATH"

success "Script de atualização instalado em ${UPDATE_SCRIPT_PATH}."

info "Criando serviço systemd para rodar a atualização a cada boot..."

cat > "$UPDATE_SERVICE_FILE" <<EOF
[Unit]
Description=Verifica e aplica atualizacao do devbvbs.war no boot
After=network-online.target
Wants=network-online.target
StartLimitIntervalSec=1800
StartLimitBurst=5

[Service]
Type=oneshot
ExecStart=${UPDATE_SCRIPT_PATH}
RemainAfterExit=no
TimeoutStartSec=600
Restart=on-failure
RestartSec=60

[Install]
WantedBy=multi-user.target
EOF

chmod 644 "$UPDATE_SERVICE_FILE"

systemctl daemon-reload
systemctl enable devbvbs-update.service

success "Serviço devbvbs-update habilitado — vai rodar automaticamente a cada boot."

info "Executando uma vez agora, como teste..."

if systemctl start devbvbs-update.service; then
    success "Execução de teste do devbvbs-update concluída."
else
    warn "O serviço devbvbs-update falhou nesta execução de teste."
    warn "Verifique: journalctl -u devbvbs-update -n 50 --no-pager"
fi

# ==============================================================================
# 33. CRIAR ATALHO DA APLICAÇÃO E INICIALIZAÇÃO AUTOMÁTICA
# ==============================================================================

section "CRIANDO ATALHO DA APLICAÇÃO E INICIALIZAÇÃO AUTOMÁTICA"

# O instalador inteiro roda como root. Portanto, nunca use $HOME neste trecho:
# o HOME seria /root e o atalho não apareceria para o usuário da sessão gráfica.

if id "$DESKTOP_USER" >/dev/null 2>&1; then

    DESKTOP_USER_HOME="$(getent passwd "$DESKTOP_USER" | cut -d: -f6)"

    if [ -z "$DESKTOP_USER_HOME" ] || [ ! -d "$DESKTOP_USER_HOME" ]; then
        error "Não foi possível localizar a pasta pessoal do usuário ${DESKTOP_USER}."
    fi

    APP_LAUNCHER="/usr/local/bin/${APP_DESKTOP_FILE%.desktop}-launcher"
    APP_APPLICATIONS_DIR="${DESKTOP_USER_HOME}/.local/share/applications"
    APP_DESKTOP_PATH="${APP_APPLICATIONS_DIR}/${APP_DESKTOP_FILE}"
    APP_AUTOSTART_DIR="${DESKTOP_USER_HOME}/.config/autostart"
    APP_AUTOSTART_PATH="${APP_AUTOSTART_DIR}/${APP_DESKTOP_FILE}"

    CHROMIUM_BIN="$(command -v ungoogled-chromium || true)"

    if [ -z "$CHROMIUM_BIN" ]; then
        error "Ungoogled Chromium não foi encontrado; não foi possível criar o atalho da aplicação."
    fi

    # --------------------------------------------------------------------------
    # Launcher
    #
    # O launcher é usado tanto pelo atalho quanto pelo autostart.
    # No autostart ele aguarda a aplicação responder antes de abrir o Chromium.
    # Isso é mais confiável do que um sleep fixo de 15 segundos.
    # --------------------------------------------------------------------------

    info "Criando launcher ${APP_LAUNCHER}..."

    cat > "$APP_LAUNCHER" <<EOF
#!/bin/sh

APP_URL="${APP_URL}"
MAX_WAIT=120
WAIT=0

# Aguarda o Tomcat/devbvbs ficar disponível.
# O teste é feito apenas no localhost e não depende de conteúdo específico.
while [ "\$WAIT" -lt "\$MAX_WAIT" ]; do
    if curl -fsS --max-time 2 "\$APP_URL" >/dev/null 2>&1; then
        break
    fi

    sleep 2
    WAIT=\$((WAIT + 2))
done

exec "${CHROMIUM_BIN}" \
    --app="\$APP_URL" \
    --start-fullscreen \
    --noerrdialogs \
    --disable-session-crashed-bubble
EOF

    chmod 755 "$APP_LAUNCHER"
    chown root:root "$APP_LAUNCHER"

    # --------------------------------------------------------------------------
    # Diretórios do usuário
    # --------------------------------------------------------------------------

    mkdir -p \
        "$APP_APPLICATIONS_DIR" \
        "$APP_AUTOSTART_DIR"

    chown "$DESKTOP_USER":"$(id -gn "$DESKTOP_USER")" \
        "${DESKTOP_USER_HOME}/.local" \
        "${DESKTOP_USER_HOME}/.local/share" \
        "$APP_APPLICATIONS_DIR" \
        "${DESKTOP_USER_HOME}/.config" \
        "$APP_AUTOSTART_DIR"

    # --------------------------------------------------------------------------
    # Atalho do aplicativo
    # --------------------------------------------------------------------------

    cat > "$APP_DESKTOP_PATH" <<EOF
[Desktop Entry]
Version=1.0
Name=${APP_NAME}
Comment=Aplicativo Web devbvbs
Exec=${APP_LAUNCHER}
Icon=${APP_ICON}
Terminal=false
Type=Application
Categories=Network;WebBrowser;
StartupNotify=true
EOF

    # --------------------------------------------------------------------------
    # Autostart do LXQt
    # --------------------------------------------------------------------------

    cat > "$APP_AUTOSTART_PATH" <<EOF
[Desktop Entry]
Version=1.0
Name=${APP_NAME}
Comment=Abre o devbvbs automaticamente após o login
Exec=${APP_LAUNCHER}
Icon=${APP_ICON}
Terminal=false
Type=Application
X-GNOME-Autostart-enabled=true
X-LXQt-Autostart-enabled=true
EOF

    chmod 644 "$APP_DESKTOP_PATH" "$APP_AUTOSTART_PATH"

    chown "$DESKTOP_USER":"$(id -gn "$DESKTOP_USER")" \
        "$APP_DESKTOP_PATH" \
        "$APP_AUTOSTART_PATH"

    if command -v desktop-file-validate >/dev/null 2>&1; then
        desktop-file-validate "$APP_DESKTOP_PATH" "$APP_AUTOSTART_PATH" \
            || error "Os arquivos .desktop gerados não são válidos."
    fi

    if command -v update-desktop-database >/dev/null 2>&1; then
        update-desktop-database "$APP_APPLICATIONS_DIR" || true
    fi

    # --------------------------------------------------------------------------
    # Criar atalho na Área de Trabalho
    #
    # xdg-user-dir respeita o idioma/configuração do usuário:
    # pode retornar Desktop, Área de Trabalho etc.
    # --------------------------------------------------------------------------

    APP_DESKTOP_DIR="$(
        runuser -u "$DESKTOP_USER" -- \
            env HOME="$DESKTOP_USER_HOME" \
            xdg-user-dir DESKTOP 2>/dev/null || true
    )"

    if [ -z "$APP_DESKTOP_DIR" ] || [ "$APP_DESKTOP_DIR" = "$DESKTOP_USER_HOME" ]; then
        APP_DESKTOP_DIR="${DESKTOP_USER_HOME}/Desktop"
    fi

    mkdir -p "$APP_DESKTOP_DIR"
    chown "$DESKTOP_USER":"$(id -gn "$DESKTOP_USER")" "$APP_DESKTOP_DIR"

    APP_DESKTOP_SHORTCUT_PATH="${APP_DESKTOP_DIR}/${APP_DESKTOP_FILE}"

    cp "$APP_DESKTOP_PATH" "$APP_DESKTOP_SHORTCUT_PATH"
    chmod 755 "$APP_DESKTOP_SHORTCUT_PATH"
    chown "$DESKTOP_USER":"$(id -gn "$DESKTOP_USER")" \
        "$APP_DESKTOP_SHORTCUT_PATH"

    success "Launcher criado: ${APP_LAUNCHER}"
    success "Atalho do aplicativo criado: ${APP_DESKTOP_PATH}"
    success "Atalho também criado na Área de Trabalho: ${APP_DESKTOP_SHORTCUT_PATH}"
    success "Inicialização automática criada: ${APP_AUTOSTART_PATH}"

else

    warn "Usuário ${DESKTOP_USER} não encontrado; atalho e inicialização automática não foram criados."

fi

# 34. LIMPEZA DO APT
# ==============================================================================

section "LIMPEZA"

apt_get autoremove -y
apt_get clean

success "Limpeza concluída."

# ==============================================================================
# 35. RESUMO
# ==============================================================================

section "INSTALAÇÃO CONCLUÍDA"

echo
echo -e "${GREEN}Sistema:${NC}"
echo "  ${PRETTY_NAME}"

echo
echo -e "${GREEN}Arquitetura:${NC}"
echo "  ${ARCH}"

echo
echo -e "${GREEN}Java:${NC}"
java -version 2>&1 | head -n 1

echo
echo -e "${GREEN}JAVA_HOME:${NC}"
echo "  ${JAVA_HOME_DIR}"

echo
echo -e "${GREEN}Tomcat:${NC}"
echo "  Versão: ${TOMCAT_VERSION}"
echo "  Diretório: ${TOMCAT_INSTALL_DIR}"
echo "  Usuário: ${TOMCAT_USER}"
echo "  Porta: ${TOMCAT_PORT}"
echo "  Heap inicial: ${TOMCAT_XMS}"
echo "  Heap máximo: ${TOMCAT_XMX}"

echo
echo -e "${GREEN}Chrome:${NC}"
if command -v ungoogled-chromium >/dev/null 2>&1; then
    ungoogled-chromium --version || true
else
    echo "  não encontrado"
fi

echo
echo -e "${GREEN}AnyDesk:${NC}"
if command -v anydesk >/dev/null 2>&1; then
    anydesk --version 2>/dev/null || echo "  instalado"
else
    echo "  não encontrado"
fi

echo
echo -e "${GREEN}Touchscreen (eGTouch):${NC}"
if command -v eGTouchD >/dev/null 2>&1; then
    echo "  driver instalado (interface: ${EGTOUCH_INTERFACE}, controladores: ${EGTOUCH_CONTROLLER_COUNT})"
else
    echo "  não instalado / não detectado"
fi

echo
echo -e "${GREEN}Ferramentas instaladas:${NC}"
echo "  net-tools"
echo "  bwm-ng"
echo "  htop"
echo "  openssh-server"
echo "  atop"

echo
echo -e "${GREEN}Serviços:${NC}"
echo "  Tomcat:  $(systemctl is-active tomcat 2>/dev/null || echo 'indisponível')"
echo "  SSH:     $(systemctl is-active ssh 2>/dev/null || echo 'indisponível')"
echo "  AnyDesk: $(systemctl is-active anydesk 2>/dev/null || echo 'indisponível')"
echo "  atop:    $(systemctl is-active atop 2>/dev/null || echo 'indisponível')"

echo
echo -e "${GREEN}Acesso ao Tomcat:${NC}"
echo "  http://localhost:${TOMCAT_PORT}"

echo
echo -e "${GREEN}Comandos úteis:${NC}"
echo "  systemctl status tomcat"
echo "  systemctl restart tomcat"
echo "  journalctl -u tomcat -f"
echo "  ss -lntp"
echo "  netstat -tulpn"
echo "  htop"
echo "  atop"
echo "  bwm-ng"

echo
echo -e "${GREEN}Arquivos importantes:${NC}"
echo "  Tomcat:       ${TOMCAT_INSTALL_DIR}"
echo "  Configuração: ${TOMCAT_INSTALL_DIR}/conf"
echo "  Logs:         ${TOMCAT_INSTALL_DIR}/logs"
echo "  Systemd:      /etc/systemd/system/tomcat.service"
echo "  JAVA_HOME:    /etc/profile.d/jdk.sh"
echo "  Aplicação:    ${TOMCAT_INSTALL_DIR}/webapps/devbvbs.war"

echo
echo -e "${GREEN}Atualização automática:${NC}"
echo "  Script:   ${UPDATE_SCRIPT_PATH}"
echo "  Serviço:  devbvbs-update.service (roda a cada boot)"
echo "  Status:   $(systemctl is-enabled devbvbs-update.service 2>/dev/null || echo desconhecido)"
echo "  Log:      /var/log/devbvbs-update.log"

echo
echo -e "${GREEN}Kiosk / Tela:${NC}"
echo "  XScreenSaver: desabilitado/removido"
echo "  DPMS/screensaver X11: desabilitado"
echo "  Suspensão/hibernação: bloqueadas"
echo "  Atualizações automáticas/notificações: desabilitadas"

echo
echo -e "${GREEN}Aplicação web:${NC}"
echo "  Nome:     ${APP_NAME}"
echo "  Endereço: ${APP_URL}"
if id "$DESKTOP_USER" >/dev/null 2>&1; then
    echo "  Atalho:   ${APP_DESKTOP_PATH:-não criado}"
    echo "  Desktop:  ${APP_DESKTOP_SHORTCUT_PATH:-não criado}"
    echo "  Autostart:${APP_AUTOSTART_PATH:-não criado}"
fi

echo
echo -e "${GREEN}Grupos do usuário ${TOMCAT_USER}:${NC}"
id -Gn "$TOMCAT_USER" 2>/dev/null || echo "  não foi possível consultar"

echo
echo -e "${GREEN}Grupos do usuário ${DESKTOP_USER}:${NC}"
id -Gn "$DESKTOP_USER" 2>/dev/null || echo "  usuário não encontrado nesta máquina"

if [ "$TOUCH_REBOOT_REQUIRED" -eq 1 ]; then
    echo
    warn "O driver de touchscreen eGTouch requer reinicialização para funcionar completamente."
    warn "Execute 'sudo reboot' quando for conveniente."
fi

echo
success "=============================================================="
success " INSTALAÇÃO FINALIZADA COM SUCESSO"
success "=============================================================="

if [ "$REBOOT_AT_END" -eq 1 ]; then
    warn "A máquina será reiniciada automaticamente em 10 segundos..."
    sleep 10
    systemctl reboot
fi

