#!/usr/bin/env bash
# ==============================================================================
# Script de Instalación Offline de Zimbra (Corregido: Permisos, Dpkg y LDAP)
# ==============================================================================

set -e

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. Verificar carpeta de paquetes .deb
if [ ! -d "$PKG_DIR" ]; then
    PKG_DIR="$BASE"
fi

cd "$PKG_DIR"

DEB_COUNT=$(ls -1 *.deb 2>/dev/null | wc -l)
if [ "$DEB_COUNT" -eq 0 ]; then
    echo "Error: No se encontraron archivos .deb en $PKG_DIR" >&2
    exit 1
fi

echo "==> Se encontraron $DEB_COUNT paquetes .deb en $PKG_DIR."

# 3. Pre-crear estructuras en /opt/zimbra para evitar errores de '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 en zimbra-postfix
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

# 4. Desempaquetar e instalar paquetes .deb
echo "==> Desempaquetando e instalando paquetes .deb..."
dpkg --unpack *.deb || true
dpkg --configure -a --force-confold --force-confdef || true

# 5. Corregir estado de apt y dependencias
echo "==> Verificando y resolviendo dependencias con APT..."
export DEBIAN_FRONTEND=noninteractive
apt-get install -f -y || true
dpkg --configure -a

# 6. CORRECCIÓN CRÍTICA DE LDAP: Forzar modo LDAP Master para evitar el error de réplica
echo "==> Ajustando configuración previa de LDAP en zmlocalconfig..."
if [ -f /opt/zimbra/bin/zmlocalconfig ]; then
    # Forzar el rol a Master
    /opt/zimbra/bin/zmlocalconfig -e ldap_is_master=true || true
    
    # Asegurar que el usuario y permisos pertenezcan a zimbra
    chown -R zimbra:zimbra /opt/zimbra/conf 2>/dev/null || true
    chown -R zimbra:zimbra /opt/zimbra/data 2>/dev/null || true
fi

# 7. Reparar permisos globales de Zimbra antes del setup
if [ -x /opt/zimbra/libexec/zmfixperms ]; then
    echo "==> Ajustando permisos en /opt/zimbra..."
    /opt/zimbra/libexec/zmfixperms --extended || true
fi

# 8. Ejecutar el instalador interactivo de Zimbra
echo "================================================================="
echo "Iniciando instalador interactivo de Zimbra..."
echo "================================================================="

if [ -d "$BASE/zcs" ] && [ -f "$BASE/zcs/install.sh" ]; then
    cd "$BASE/zcs"
    chmod +x install.sh
    ./install.sh "$@"
else
    echo "Error: No se encontró el archivo install.sh en $BASE/zcs" >&2
    exit 1
fi