#!/usr/bin/env bash
#
# restaurer-dconf.sh
#
# Restaure une sauvegarde complète dconf après confirmation.
#

set -Eeuo pipefail
umask 077

# Ne pas exécuter en root.
if [[ ${EUID} -eq 0 ]]; then
    echo "ERREUR : exécute ce script depuis le compte utilisateur concerné."
    exit 1
fi

if [[ $# -ne 1 ]]; then
    echo "Usage : $0 sauvegarde-complete.dconf"
    exit 2
fi

BACKUP="$1"

if [[ ! -f "$BACKUP" || ! -r "$BACKUP" ]]; then
    echo "ERREUR : fichier introuvable ou illisible : $BACKUP"
    exit 1
fi

for cmd in dconf date; do
    if ! command -v "$cmd" >/dev/null 2>&1; then
        echo "ERREUR : commande manquante : $cmd"
        exit 1
    fi
done

# Répertoire des sauvegardes de sécurité.
BACKUPDIR="${HOME}/dconf-backups"
mkdir -p -- "$BACKUPDIR"
chmod 700 "$BACKUPDIR"

# Horodatage à la seconde.
STAMP="$(date '+%Y%m%d_%H%M%S')"
BASE="dconf-before-restore-${STAMP}"
SAFETY="${BACKUPDIR}/${BASE}.dconf"

n=1
while [[ -e "$SAFETY" ]]; do
    SAFETY="${BACKUPDIR}/${BASE}_${n}.dconf"
    ((n += 1))
done

echo "Sauvegarde à restaurer :"
echo "  $BACKUP"
echo
echo "Utilisateur : ${USER}"
echo "Machine : $(hostname)"
echo

# Sauvegarde de sécurité avant restauration.
if ! dconf dump / > "$SAFETY"; then
    rm -f -- "$SAFETY"
    echo "ERREUR : impossible de sauvegarder l'état actuel."
    echo "Restauration annulée."
    exit 1
fi

chmod 600 "$SAFETY"

echo "Sauvegarde de sécurité créée :"
echo "  $SAFETY"
echo
echo "ATTENTION : la restauration remplacera tous les paramètres"
echo "dconf utilisateur actuellement définis."
echo

read -r -p "Confirmer la restauration ? [o/N] " answer

case "$answer" in
    o|O|oui|OUI|Oui) ;;
    *)
        echo "Restauration annulée."
        echo "La sauvegarde de sécurité reste disponible :"
        echo "  $SAFETY"
        exit 0
        ;;
esac

echo
echo "Réinitialisation de la base dconf utilisateur..."

if ! dconf reset -f /; then
    echo "ERREUR : impossible de réinitialiser dconf."
    echo "Sauvegarde de sécurité : $SAFETY"
    exit 1
fi

echo "Chargement de la sauvegarde..."

if ! dconf load / < "$BACKUP"; then
    echo "ERREUR : le chargement de la sauvegarde a échoué."
    echo "Tentative de restauration de l'état précédent..."

    if dconf reset -f / && dconf load / < "$SAFETY"; then
        echo "L'état précédent a été restauré."
    else
        echo "ATTENTION : restauration automatique impossible."
        echo "Sauvegarde de sécurité : $SAFETY"
        echo "Tu peux tenter de la recharger manuellement."
    fi

    exit 1
fi

echo
echo "Restauration terminée."
echo "Sauvegarde appliquée : $BACKUP"
echo "Sauvegarde de sécurité : $SAFETY"
echo
echo "Si nécessaire, déconnecte-toi puis reconnecte-toi"
echo "pour que Cinnamon recharge certains paramètres."

