#!/bin/sh
# session-cinnamon — Aislamiento XDG de Canaima para Cinnamon
# Paquete: cinnamon-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-cinnamon 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-cinnamon <comando>).

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

# ===== [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 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 2>/dev/null

# ===== [ESPECÍFICO] Verificar que el fondo configurado exista (Parte 35) =====
# La resolución del PNG varía según la versión de desktop-base; si el
# archivo configurado no existe, buscar una alternativa en su carpeta.
reparar_fondo() {
    clave="$1"
    valor=$(dconf read "$clave" 2>/dev/null)
    ruta=${valor#\'}
    ruta=${ruta%\'}
    prefijo=""
    case "$ruta" in
        file://*) prefijo="file://"; ruta=${ruta#file://} ;;
    esac
    [ -n "$ruta" ] || return 0
    [ -f "$ruta" ] && return 0
    dir=$(dirname "$ruta")
    nuevo=""
    for c in "$dir/3840x2160.png" "$dir/2560x1440.png" "$dir/canaima-alternativo.png"; do
        if [ -f "$c" ]; then nuevo="$c"; break; fi
    done
    if [ -z "$nuevo" ]; then
        for c in "$dir"/*.png; do
            if [ -f "$c" ]; then nuevo="$c"; break; fi
        done
    fi
    if [ -n "$nuevo" ]; then
        dconf write "$clave" "'$prefijo$nuevo'" 2>/dev/null
    fi
    return 0
}
reparar_fondo /org/cinnamon/desktop/background/picture-uri

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