#!/bin/sh
# session-lxde — Aislamiento XDG de Canaima para LXDE
# Paquete: lxde-conf
#
# Los bloques marcados [COMÚN] son idénticos en los 7 paquetes -conf; solo
# cambian las variables de CONFIGURACIÓN y los bloques [ESPECÍFICO].
# Comparar entre paquetes con:  diff session-lxde session-<otro>
#
# El .desktop de la sesión llama a este script seguido del comando original
# de la sesión (Exec=/usr/libexec/canaima-xdg/session-lxde <comando>).

# ===== CONFIGURACIÓN (específica de este paquete) =====
ENTORNO="lxde"
DATOS="/usr/share/lxde-conf/xdg"
VERSION_PAQ="/usr/share/lxde-conf/version"
SESION_BIN="/usr/bin/startlxde"

# ===== [COMÚN 0] También como intermediario del programa del escritorio =====
# El paquete desvía con dpkg-divert el programa que arranca el escritorio y
# pone en su lugar un enlace a este script; el original queda en
# <programa>.canaima-orig. Programas: /usr/bin/startlxde /usr/bin/lxsession.
# Así, se entre por donde se entre (pantalla de inicio, «Default Xsession»,
# startx, ~/.xsession, SDDM...), la sesión pasa por el aislamiento (Parte 45).
# Se sigue la cadena de enlaces con que se llamó (p. ej. x-session-manager ->
# /etc/alternatives -> startxfce4 -> este script) hasta el programa desviado.
ORIGINAL=""
case "$(basename "$0")" in
    "session-$ENTORNO") ;;
    *)
        enlace="$0"
        case "$enlace" in
            */*) ;;
            *) enlace=$(command -v "$enlace" 2>/dev/null || echo "$enlace") ;;
        esac
        vueltas=0
        while [ -L "$enlace" ] && [ "$vueltas" -lt 10 ]; do
            if [ -x "$enlace.canaima-orig" ]; then
                ORIGINAL="$enlace.canaima-orig"
                break
            fi
            destino=$(readlink "$enlace")
            case "$destino" in
                /*) enlace="$destino" ;;
                *) enlace="$(dirname "$enlace")/$destino" ;;
            esac
            vueltas=$((vueltas + 1))
        done
        ;;
esac
# Llamado con un nombre desconocido: se arranca el escritorio por su nombre
# normal (que vuelve a pasar por aquí y ya encuentra el original).
# Si la sesión ya está aislada (p. ej. el .desktop llamó a este script y
# este al programa del escritorio), arrancar directamente sin repetir nada.
if [ "${CANAIMA_XDG_ENTORNO:-}" = "$ENTORNO" ]; then
    if [ -n "$ORIGINAL" ]; then
        exec "$ORIGINAL" "$@"
    fi
    if [ "$#" -gt 0 ]; then
        exec "$@"
    fi
    exec $SESION_BIN
fi
export CANAIMA_XDG_ENTORNO="$ENTORNO"

# ===== [COMÚN 1] Limpiar entorno heredado de sesiones anteriores =====
# systemd --user, dconf-service y xfconfd pueden conservar el XDG_* de otra
# sesión aislada (Partes 9, 28 y 30 del informe). Ambos servicios se
# reactivan solos por D-Bus, ya con las rutas de esta sesión.
if command -v systemctl >/dev/null 2>&1; then
    systemctl --user unset-environment \
        XDG_CONFIG_HOME XDG_DATA_HOME XDG_CACHE_HOME XDG_STATE_HOME 2>/dev/null
fi
pkill -u "$(id -u)" -x dconf-service 2>/dev/null
pkill -u "$(id -u)" -x xfconfd 2>/dev/null

# ===== [COMÚN 2] Rutas aisladas =====
BASE="$HOME/.local/xdg/$ENTORNO"
export XDG_CONFIG_HOME="$BASE/config"
export XDG_DATA_HOME="$BASE/share"
export XDG_CACHE_HOME="$BASE/cache"
export XDG_STATE_HOME="$BASE/state"
mkdir -p "$XDG_CONFIG_HOME" "$XDG_DATA_HOME" "$XDG_CACHE_HOME" "$XDG_STATE_HOME"

# ===== [COMÚN 2b] Tema Canaima incluido en el paquete (Parte 47) =====
# El paquete trae su propia copia del tema Canaima (Canaima-Claro y
# Canaima-Oscuro) en /usr/share/<paquete>/temas/themes. Se pone esa carpeta
# primero en XDG_DATA_DIRS, así el escritorio usa ese tema aunque la máquina
# no tenga tema-canaima o tenga una versión vieja. Se quita antes cualquier
# carpeta de tema de otro -conf que viniera de una sesión anterior.
TEMAS_PAQ="${DATOS%/xdg}/temas"
if [ -d "$TEMAS_PAQ/themes" ]; then
    dirs=$(printf '%s\n' "${XDG_DATA_DIRS:-/usr/local/share:/usr/share}" | tr ':' '\n' \
        | grep -v '^/usr/share/[^/]*-conf/temas/*$' | grep -v '^$' | paste -sd: -)
    export XDG_DATA_DIRS="$TEMAS_PAQ:${dirs:-/usr/local/share:/usr/share}"
fi

# ===== [COMÚN 3] Sembrar / completar la configuración de Canaima =====
# Se ejecuta cuando el perfil no tiene la marca de esta versión del
# paquete: primer inicio de sesión (incluido el usuario "en vivo" de las
# ISOs), perfil incompleto o actualización del paquete. Solo AGREGA lo que
# falta (cp -n): nunca sobrescribe lo que el usuario ya tiene.
MARCA="$BASE/.canaima-conf-version"
if [ -f "$VERSION_PAQ" ] && ! cmp -s "$VERSION_PAQ" "$MARCA"; then
    for par in "config:$XDG_CONFIG_HOME" "share:$XDG_DATA_HOME" "state:$XDG_STATE_HOME"; do
        sub=${par%%:*}
        destino=${par#*:}
        if [ -d "$DATOS/$sub" ]; then
            cp -rn --no-preserve=ownership "$DATOS/$sub/." "$destino/" 2>/dev/null || true
        fi
    done
    cp "$VERSION_PAQ" "$MARCA" 2>/dev/null || true
fi

# ===== [COMÚN 4] gvfs-metadata compartido entre entornos (Parte 18) =====
mkdir -p "$HOME/.local/xdg/_shared/gvfs-metadata"
if [ ! -L "$XDG_DATA_HOME/gvfs-metadata" ]; then
    rm -rf "$XDG_DATA_HOME/gvfs-metadata"
    ln -s "$HOME/.local/xdg/_shared/gvfs-metadata" "$XDG_DATA_HOME/gvfs-metadata"
fi

# ===== [COMÚN 5] Propagar las rutas a D-Bus y systemd --user =====
dbus-update-activation-environment --systemd \
    XDG_CONFIG_HOME XDG_DATA_HOME XDG_CACHE_HOME XDG_STATE_HOME XDG_DATA_DIRS 2>/dev/null

# ===== [ESPECÍFICO] (ninguno para este entorno) =====

# ===== [COMÚN 6] Iniciar la sesión real =====
if [ -n "$ORIGINAL" ]; then
    exec "$ORIGINAL" "$@"
fi
if [ "$#" -gt 0 ]; then
    exec "$@"
fi
exec $SESION_BIN
