#!/usr/bin/env bash
# ==============================================================================
# GuideOS Desktop-Sicherung
# ------------------------------------------------------------------------------
# Beschreibung:
# Dieses Tool ermöglicht es Einsteigern, ihren gesamten Cinnamon-Desktop
# zu sichern und wiederherzustellen, inklusive:
#   - Panel-Layout und angepinnter Starter
#   - Lieblings-Apps
#   - Desktop-Wallpaper
#   - Cinnamon- und Nemo-Einstellungen
#   - Applets, Desklets und Extensions
#   - Relevante Konfigurations- und Benutzerverzeichnisse
# Die Sicherung erfolgt in einem komprimierten .tar.gz-Archiv.
#
# Autor: evilware666 & Helga
# Version: 1.3
# Datum: 2025-12-08
# ==============================================================================


set -euo pipefail
IFS=$'\n\t'

info() {
    echo "$1"
}

error() {
    if command -v zenity >/dev/null 2>&1; then
        zenity --error --no-wrap --text "$1"
    else
        echo "Fehler: $1"
    fi
    exit 1
}

# Temp-Verzeichnis
TMPDIR=$(mktemp -d)

cleanup() {
    rm -rf "$TMPDIR"
}
trap cleanup EXIT

USER_HOME="$HOME"

# ---------------------------------------------------------
# Backup erstellen
# ---------------------------------------------------------
backup_cinnamon() {

BACKUP_FILE=$(zenity --file-selection \
    --save \
    --confirm-overwrite \
    --title="Speicherort f\u00fcr Sicherung ausw\u00e4hlen" \
    --filename="$HOME/cinnamon-backup-$(date +%Y-%m-%d_%H-%M).tar.gz")

[[ -z "$BACKUP_FILE" ]] && return

    info "Sicherung wird vorbereitet \u2026"
    mkdir -p "$TMPDIR/data"

    # dconf sichern
    dconf dump / > "$TMPDIR/data/dconf-full.dconf" || error "dconf konnte nicht gesichert werden."

    # Cinnamon + Nemo + Themes + Hintergrundbilder
    DIRS=(
        ".config/cinnamon"
        ".config/nemo"
        ".local/share/cinnamon"
        ".local/share/nemo"
        ".local/share/backgrounds"
        ".config/gtk-3.0"
        ".themes"
        ".icons"
        ".fonts"
    )

    for d in "${DIRS[@]}"; do
        if [[ -d "$USER_HOME/$d" ]]; then
            mkdir -p "$TMPDIR/data/$d"
            cp -a "$USER_HOME/$d" "$TMPDIR/data/$d/../" 2>/dev/null || true
        fi
    done

    # Plank sichern
    PLANK_DIRS=(
        ".config/plank"
        ".local/share/plank"
    )

    for p in "${PLANK_DIRS[@]}"; do
        if [[ -d "$USER_HOME/$p" ]]; then
            info "Sichere Plank: $p \u2026"
            mkdir -p "$TMPDIR/data/$p"
            cp -a "$USER_HOME/$p" "$TMPDIR/data/$p/../" || true
        fi
    done

    # Plank-Status speichern
    mkdir -p "$TMPDIR/data/.plank-status"
    if pgrep plank >/dev/null 2>&1; then
        echo "yes" > "$TMPDIR/data/.plank-status/active"
    else
        echo "no" > "$TMPDIR/data/.plank-status/active"
    fi

    # Archiv packen
    tar -czf "$BACKUP_FILE" -C "$TMPDIR" data || error "Sicherung konnte nicht erstellt werden."

    zenity --info --no-wrap --text "Sicherung erfolgreich erstellt."
}

# ---------------------------------------------------------
# Backup wiederherstellen
# ---------------------------------------------------------
restore_cinnamon() {

    BACKUP_TO_RESTORE=$(zenity --file-selection --title="Sicherung ausw\u00e4hlen")
    [[ -z "$BACKUP_TO_RESTORE" ]] && return

    info "Backup wird entpackt \u2026"
    tar -xzf "$BACKUP_TO_RESTORE" -C "$TMPDIR" || error "Entpacken fehlgeschlagen."

    # dconf wiederherstellen
    if [[ -f "$TMPDIR/data/dconf-full.dconf" ]]; then
        dconf load / < "$TMPDIR/data/dconf-full.dconf" || error "dconf Wiederherstellung fehlgeschlagen."
    fi

    # Benutzerkonfigurationen zur\u00fcckkopieren
    cp -a "$TMPDIR/data/." "$USER_HOME/" || error "Kopieren der Daten fehlgeschlagen."
    chown -R "$USER:$USER" "$USER_HOME"

    # Plank-Ordner zur\u00fcckkopieren
    for p in ".config/plank" ".local/share/plank"; do
        SRC="$TMPDIR/data/$p"
        DEST="$USER_HOME/$p"

        if [[ -d "$SRC" ]]; then
            rm -rf "$DEST"
            mkdir -p "$(dirname "$DEST")"
            cp -a "$SRC" "$DEST"
            chown -R "$USER:$USER" "$DEST"
        fi
    done

    # ---------------------------------------------------------
    # Plank-Status wiederherstellen
    # ---------------------------------------------------------
    PLANK_STATUS_FILE="$TMPDIR/data/.plank-status/active"

    if [[ -f "$PLANK_STATUS_FILE" ]]; then
        STATUS=$(cat "$PLANK_STATUS_FILE")

        AUTOSTART_FILE="$USER_HOME/.config/autostart/plank.desktop"

        # Wenn Plank vorher NICHT aktiv war
        if [[ "$STATUS" == "no" ]]; then
            pkill plank 2>/dev/null || true

            if [[ -f "$AUTOSTART_FILE" ]]; then
                sed -i 's/^X-GNOME-Autostart-enabled=.*/X-GNOME-Autostart-enabled=false/' "$AUTOSTART_FILE"
            fi
        fi

        # Wenn Plank aktiv war
        if [[ "$STATUS" == "yes" ]]; then
            if command -v plank >/dev/null 2>&1; then
                pkill plank 2>/dev/null || true
                nohup plank >/dev/null 2>&1 &
            fi
        fi
    fi

    info "Wiederherstellung abgeschlossen."

    zenity --info --no-wrap --text "Wiederherstellung abgeschlossen.\n\nBitte melde dich einmal ab und wieder an,\ndamit alle Einstellungen korrekt \u00fcbernommen werden."
}

# ---------------------------------------------------------
# Hauptmen\u00fc
# ---------------------------------------------------------
while true; do
    aktion=$(zenity --list \
        --title="GuideOS Desktop-Sicherung" \
        --column="Aktion" \
        "Sicherung erstellen" \
        "Sicherung wiederherstellen" \
        "Beenden")

    [[ -z "$aktion" || "$aktion" == "Beenden" ]] && exit 0

    if [[ "$aktion" == "Sicherung erstellen" ]]; then
        backup_cinnamon
    elif [[ "$aktion" == "Sicherung wiederherstellen" ]]; then
        restore_cinnamon
    fi
done
