#!/bin/bash
# Auteur : BENE Maël
# Version : 1.1
# Description : Restauration interactive d’un dossier ou d’un fichier individuel (version améliorée avec journalisation)

set -euo pipefail

# Configuration
DEST_USER="backup-user"
DEST_HOST="stockage"
DEST_BASE="/home/$DEST_USER/backup"
BASE_RESTORE_DIR="/home/oclassroom/mairie"
LOG_FILE="/home/oclassroom/backup-logs/restores_inc.log"

# Fonction de log
log_header() {
    local type="$1"  # "Dossier complet" ou "Fichier spécifique"
    {
        echo "====================================================="
        echo "[$START_DATE] ➤ DÉBUT DE LA RESTAURATION INCRÉMENTALE"
        echo "Dossier restauré : $DOSSIER"
        echo "Type : $type"
        echo "Horodatage de la sauvegarde : $BACKUP_TIMESTAMP"
        echo "====================================================="
    } >> "$LOG_FILE"
}

# Liste des dossiers disponibles (hors MACHINES)
DIR_LIST=$(ssh "$DEST_USER@$DEST_HOST" "ls -1 $DEST_BASE" | grep -v '^MACHINES$')
if [ -z "$DIR_LIST" ]; then
    echo "Aucun dossier de sauvegarde trouvé."
    exit 1
fi

echo "Dossiers disponibles à la restauration :"
DIR_ARRAY=()
i=1
while read -r line; do
    echo " $i) $line"
    DIR_ARRAY+=("$line")
    ((i++))
done <<< "$DIR_LIST"

read -rp "Numéro du dossier à restaurer : " DIR_NUM
DOSSIER="${DIR_ARRAY[$((DIR_NUM - 1))]}"

# Liste des sauvegardes disponibles
BACKUP_LIST=$(ssh "$DEST_USER@$DEST_HOST" "ls -1dt $DEST_BASE/$DOSSIER/20*_* 2>/dev/null")

if [ -z "$BACKUP_LIST" ]; then
    echo "Aucune sauvegarde trouvée pour $DOSSIER."
    exit 1
fi

echo "Sauvegardes disponibles pour '$DOSSIER' :"
BACKUP_ARRAY=()
i=1
while read -r line; do
    SHORT=$(echo "$line" | sed "s|$DEST_BASE/||")
    echo " $i) $SHORT"
    BACKUP_ARRAY+=("$line")
    ((i++))
done <<< "$BACKUP_LIST"

read -rp "Numéro de la sauvegarde à restaurer (Entrée = latest) : " BACKUP_NUM
if [ -z "$BACKUP_NUM" ]; then
    SELECTED_BACKUP=$(ssh "$DEST_USER@$DEST_HOST" "readlink -f '$DEST_BASE/$DOSSIER/latest'" || true)
    if [ -z "$SELECTED_BACKUP" ]; then
        echo "Aucun lien 'latest' trouvé pour ce dossier."
        exit 1
    fi
else
    SELECTED_BACKUP="${BACKUP_ARRAY[$((BACKUP_NUM - 1))]}"
fi

echo "Sauvegarde sélectionnée : $(echo "$SELECTED_BACKUP" | sed "s|$DEST_BASE/||")"

# Horodatage pour les logs
START_DATE=$(date '+%Y-%m-%d %H:%M:%S')
BACKUP_TIMESTAMP=$(basename "$SELECTED_BACKUP")

# Choix entre restauration complète ou fichier spécifique
echo "Que voulez-vous restaurer ?"
select CHOIX in "Dossier complet" "Fichier spécifique"; do
    case $REPLY in
        1)
            RESTORE_PATH="$BASE_RESTORE_DIR/$DOSSIER"
            echo "➤ Restauration complète dans : $RESTORE_PATH"
            mkdir -p "$RESTORE_PATH"
            log_header "Dossier complet"
            rsync -av -e ssh "$DEST_USER@$DEST_HOST:$SELECTED_BACKUP/" "$RESTORE_PATH/" >> "$LOG_FILE" 2>&1
            echo "Dossier restauré avec succès."
            break
            ;;
        2)
            echo "Liste des fichiers disponibles :"
            FILE_LIST=$(ssh "$DEST_USER@$DEST_HOST" "cd '$SELECTED_BACKUP' && find . -type f" | sed 's|^\./||')
            if [ -z "$FILE_LIST" ]; then
                echo "Aucun fichier trouvé dans la sauvegarde."
                exit 1
            fi

            FILE_ARRAY=()
            i=1
            while read -r file; do
                echo " $i) $file"
                FILE_ARRAY+=("$file")
                ((i++))
            done <<< "$FILE_LIST"

            read -rp "Numéro du fichier à restaurer : " FILE_NUM
            FILE_TO_RESTORE="${FILE_ARRAY[$((FILE_NUM - 1))]}"
            DEST_PATH="$BASE_RESTORE_DIR/$DOSSIER/$(dirname "$FILE_TO_RESTORE")"
            mkdir -p "$DEST_PATH"
            log_header "Fichier spécifique"
            echo "➤ Restauration de '$FILE_TO_RESTORE' vers '$DEST_PATH'" >> "$LOG_FILE"
            rsync -av -e ssh "$DEST_USER@$DEST_HOST:$SELECTED_BACKUP/$FILE_TO_RESTORE" "$DEST_PATH/" >> "$LOG_FILE" 2>&1
            echo "Fichier restauré avec succès."
            break
            ;;
        *)
            echo "Choix invalide."
            ;;
    esac
done
