#!/bin/bash

# Abortar se se produce calquera erro
set -e

# Gardar toda a saída tamén nun log no cliente
LOG="/var/log/instalar_libreoffice.log"
exec > >(tee -a "$LOG") 2>&1
echo "===== $(date '+%Y-%m-%d %H:%M:%S') ====="

DIR_TEMPORAL="/tmp/instalacion_libreoffice"
USER_AGENT="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36"
WGET_OPTS=(--no-check-certificate -c --user-agent="$USER_AGENT" --tries=3 --retry-connrefused --waitretry=2 --progress=dot:giga)

MIRROR_UDC="https://ftp.udc.es/tdf/libreoffice/stable"
MIRROR_UP="https://ftp.up.pt/tdf/libreoffice/stable"

echo "================================================="
echo " Instalador automático da última versión de LibreOffice"
echo "================================================="

# Verificación de permisos de superusuario
if [ "$EUID" -ne 0 ]; then
  echo "Erro: Executa este script como root ou usando sudo."
  exit 1
fi

# Instalar dependencias necesarias
apt-get update -qq
apt-get install -y curl wget tar ca-certificates > /dev/null

echo -e "\n1. Comprobando versións de LibreOffice instaladas no sistema..."
VERSIONES_INSTALADAS=$(dpkg-query -W -f='${Package} ${Version}\n' 'libreoffice*' 'libobasis*' 2>/dev/null | awk '$2 != "" {print $1 " (" $2 ")"}')

if [ -n "$VERSIONES_INSTALADAS" ]; then
    echo "   Encontráronse os seguintes paquetes de LibreOffice no equipo:"
    echo "$VERSIONES_INSTALADAS" | sed 's/^/      - /'
else
    echo "   Non se detectou ningunha versión de LibreOffice instalada actualmente."
fi

echo -e "\n2. Buscando a última versión estable dispoñible..."

# Función para obter a versión máis recente dun mirror
obter_ultima_version() {
    local url_mirror="$1"
    curl -s --fail --max-time 10 "$url_mirror/" | grep -oP 'href="\K[0-9]+\.[0-9]+\.[0-9]+(?=/")' | sort -V | tail -n 1
}

MIRROR_USADO=""
VERSION=$(obter_ultima_version "$MIRROR_UDC" || true)

if [ -n "$VERSION" ]; then
    MIRROR_USADO="$MIRROR_UDC"
    echo "   -> Detectada versión ${VERSION} no mirror principal (UDC)."
else
    echo "   Aviso: Fallou a conexión co mirror da UDC. Probando mirror secundario (UP)..."
    VERSION=$(obter_ultima_version "$MIRROR_UP" || true)
    if [ -n "$VERSION" ]; then
        MIRROR_USADO="$MIRROR_UP"
        echo "   -> Detectada versión ${VERSION} no mirror secundario (UP)."
    fi
fi

if [ -z "$VERSION" ]; then
    echo "Erro: Non se puido detectar a última versión en ningún dos mirrors."
    exit 1
fi

# Función de descarga que tenta o mirror principal e fai fallback ao secundario
descargar_ficheiro() {
    local nome_ficheiro="$1"
    local url_primaria="${MIRROR_UDC}/${VERSION}/deb/x86_64/${nome_ficheiro}"
    local url_secundaria="${MIRROR_UP}/${VERSION}/deb/x86_64/${nome_ficheiro}"

    echo "   Descargando ${nome_ficheiro}..."

    if wget "${WGET_OPTS[@]}" -O "$nome_ficheiro" "$url_primaria"; then
        return 0
    fi

    echo "   Aviso: Fallou a descarga desde UDC. Intentando desde UP..."
    rm -f "$nome_ficheiro"

    if wget "${WGET_OPTS[@]}" -O "$nome_ficheiro" "$url_secundaria"; then
        return 0
    fi

    echo "Erro: Non se puido descargar ${nome_ficheiro} de ningún mirror."
    exit 1
}

# Descargar ANTES de desinstalar: se falla a descarga, o equipo
# queda coa versión que xa tiña en vez de quedar sen LibreOffice.
echo -e "\n3. Creando directorio temporal..."
rm -rf "$DIR_TEMPORAL"
mkdir -p "$DIR_TEMPORAL"
cd "$DIR_TEMPORAL"

echo -e "\n4. Descargando LibreOffice ${VERSION}..."
descargar_ficheiro "LibreOffice_${VERSION}_Linux_x86-64_deb.tar.gz"
descargar_ficheiro "LibreOffice_${VERSION}_Linux_x86-64_deb_langpack_gl.tar.gz"
descargar_ficheiro "LibreOffice_${VERSION}_Linux_x86-64_deb_helppack_gl.tar.gz"

echo -e "\n5. Descomprimindo paquetes..."
for arquivo in *.tar.gz; do
    tar -xzf "$arquivo"
done

echo -e "\n6. Desinstalando versións anteriores de LibreOffice..."
apt-get purge -y "libreoffice*" "libobasis*" || true
apt-get clean

echo -e "\n7. Instalando os paquetes .deb..."
dpkg -i LibreOffice_${VERSION}*/DEBS/*.deb

echo -e "\n8. Limpando ficheiros temporais..."
cd /tmp
rm -rf "$DIR_TEMPORAL"

echo "================================================="
echo " ¡Proceso completado!"
echo " Instalouse correctamente LibreOffice ${VERSION}"
echo "================================================="
