#!/usr/bin/env bash
# ==============================================================================
# Script de Instalación Offline de Zimbra (Preparación de Entorno e Interactivo)
# ==============================================================================

set -e

# Detectar la carpeta exacta donde se encuentra este script
BASE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PKG_DIR="${BASE}/packages"

echo "==> Inicio de preparación e instalación offline..."

# 1. Comprobar permisos de root
if [ "$(id -u)" -ne 0 ]; then
    echo "Error: Este script debe ejecutarse como root o con sudo." >&2
    exit 1
fi

# 2. Liberar puertos conflictivos en el sistema (Evita 'Connection refused' y colisiones)
echo "==> Liberando puertos (25, 53, 80, 443, 389) y deteniendo servicios locales..."
services_to_stop=("postfix" "apache2" "nginx" "dovecot" "bind2" "slapd" "systemd-resolved")
for svc in "${services_to_stop[@]}"; do
    if systemctl is-active --quiet "$svc" 2>/dev/null; then
        echo " -> Deteniendo $svc..."
        systemctl stop "$svc" 2>/dev/null || true
        systemctl disable "$svc" 2>/dev/null || true
    fi
done

# Reparar resolución DNS (Asegúrate de poner aquí tu DNS real o la IP local)
if [ -L /etc/resolv.conf ] || [ -f /etc/resolv.conf ]; then
    rm -f /etc/resolv.conf
    # Cambia 10.0.0.251 por tu servidor DNS interno si aplica
    echo "nameserver 10.0.0.251" > /etc/resolv.conf
    echo "nameserver 8.8.8.8" >> /etc/resolv.conf
fi

# 3. Verificar directorio de paquetes y resolver dependencias del SO
if [ -d "$PKG_DIR" ]; then
    cd "$PKG_DIR"
    DEB_COUNT=$(ls -1 *.deb 2>/dev/null | wc -l)
    if [ "$DEB_COUNT" -gt 0 ]; then
        echo "==> Se encontraron $DEB_COUNT paquetes en $PKG_DIR. Preparando dependencias del sistema..."
        export DEBIAN_FRONTEND=noninteractive
        dpkg -i --force-depends *.deb 2>/dev/null || true
        apt-get install -f -y || true
    fi
fi

# Volver a la raíz donde reside el instalador
cd "$BASE"

# 4. Pre-crear estructuras en /opt/zimbra para evitar errores 'No such file'
echo "==> Creando estructuras base en /opt/zimbra..."
mkdir -p /opt/zimbra/common/etc/java
mkdir -p /opt/zimbra/libexec
mkdir -p /opt/zimbra/bin
mkdir -p /opt/zimbra/conf

# Stub temporal de configrewrite para evitar fallos durante instalaciones previas
if [ ! -f /opt/zimbra/libexec/configrewrite ]; then
    echo '#!/bin/sh' > /opt/zimbra/libexec/configrewrite
    echo 'exit 0' >> /opt/zimbra/libexec/configrewrite
    chmod +x /opt/zimbra/libexec/configrewrite
fi

# 5. Exportar Variables de Entorno para LDAP MASTER
echo "================================================================="
echo "Introduciendo variables de Entorno para LDAP MASTER"
echo "================================================================="

export LDAPSERVERID="1"
export LDAPREPLICATYPE="master"
export LDAPISMASTER="true"
export LDAPHOST="webmail.octopusnet.net"
export LDAPURL="ldap://webmail.octopusnet.net:389"
export LDAPMASTERURL="ldap://webmail.octopusnet.net:389"

# Si zmlocalconfig existe, forzar las llaves internamente
if [ -f /opt/zimbra/bin/zmlocalconfig ]; then
    echo "==> Ajustando configuración previa de LDAP..."
    /opt/zimbra/bin/zmlocalconfig -e ldap_is_master=true 2>/dev/null || true
    /opt/zimbra/bin/zmlocalconfig -e ldap_serverid=1 2>/dev/null || true
    /opt/zimbra/bin/zmlocalconfig -e ldap_url="ldap://webmail.octopusnet.net:389" 2>/dev/null || true
    /opt/zimbra/bin/zmlocalconfig -e ldap_master_url="ldap://webmail.octopusnet.net:389" 2>/dev/null || true
fi

# Ajustar permisos preventivos
if [ -x /opt/zimbra/libexec/zmfixperms ]; then
    echo "==> Ajustando permisos en /opt/zimbra..."
    /opt/zimbra/libexec/zmfixperms --extended 2>/dev/null || true
fi

# 6. Ejecutar el instalador interactivo oficial de Zimbra
echo "================================================================="
echo "Introdiciendo variables de Entorno para LDAP MASTER"
echo "================================================================="

export LDAPSERVERID="1"
export LDAPREPLICATYPE="master"
export LDAPISMASTER="true"

# 6. Ejecutar el instalador interactivo oficial de Zimbra
echo "================================================================="
echo "Iniciando instalador interactivo de Zimbra..."
echo "================================================================="

# Detección e invocación limpia de install.sh pasándole los argumentos del usuario (si los hay)
if [ -f "$BASE/install.sh" ]; then
    chmod +x "$BASE/install.sh"
    "$BASE/install.sh" "$@"
elif [ -f "$BASE/zcs/install.sh" ]; then
    cd "$BASE/zcs"
    chmod +x install.sh
    ./install.sh "$@"
else
    echo "Error: No se encontró install.sh en $BASE ni en $BASE/zcs" >&2
    exit 1
fi