#!/bin/bash
# rsync_backup_alldirection_cli.sh

# Variables de base
UTILISATEUR="debian"
IP_DISTANTE="666.66.66.66"
PORT_SSH="22"
LOCAL_BASE_DIR="/home"  # Répertoire de base local
MOTDEPASSE="YOURPASS"   # Votre mot de passe

# Fonction d'affichage de la progression avec animation et human-readable (-h)
afficher_progression() {
    echo -e "\e[1;32m🚀 En cours...\e[0m"
    sshpass -p "$MOTDEPASSE" rsync -avzh --progress -e "ssh -p $PORT_SSH" "$1" "$2" | pv -l -N "Transfert"
}

# ===============================
# Fonctions pour l'envoi
# ===============================

interactive_send_file() {
    echo -e "\e[1;32m[SEND] Liste des fichiers locaux dans $LOCAL_BASE_DIR :\e[0m"
    IFS=$'\n'
    local_files=( $(find "$LOCAL_BASE_DIR" -maxdepth 1 -type f -printf '%p (%kK)\n') )
    unset IFS
    if [ ${#local_files[@]} -eq 0 ]; then
        echo -e "\e[1;31m❌ Aucun fichier trouvé dans $LOCAL_BASE_DIR\e[0m"
        exit 1
    fi
    select lfile in "${local_files[@]}"; do
        if [ -n "$lfile" ]; then
            local_file=$(echo "$lfile" | awk '{print $1}')
            break
        else
            echo -e "\e[1;31m❌ Choix invalide, réessayez.\e[0m"
        fi
    done

    echo -e "\e[1;32m[SEND] Liste des répertoires distants (dans /home) :\e[0m"
    remote_dirs=$(sshpass -p "$MOTDEPASSE" ssh -p $PORT_SSH $UTILISATEUR@$IP_DISTANTE "find /home -maxdepth 1 -type d")
    select rdir in $remote_dirs; do
        if [ -n "$rdir" ]; then
            remote_dest="$rdir"
            break
        else
            echo -e "\e[1;31m❌ Choix invalide, réessayez.\e[0m"
        fi
    done

    echo -e "\e[1;32m[SEND] Envoi du fichier '$local_file' vers $UTILISATEUR@$IP_DISTANTE:$remote_dest...\e[0m"
    afficher_progression "$local_file" "$UTILISATEUR@$IP_DISTANTE:$remote_dest"
}

interactive_send_directory() {
    read -p "Spécifiez le chemin complet du répertoire local à envoyer : " local_dir
    if [ ! -d "$local_dir" ]; then
        echo -e "\e[1;31m❌ Répertoire non trouvé.\e[0m"
        exit 1
    fi
    echo -e "\e[1;32m[SEND] Liste des répertoires distants (dans /home) :\e[0m"
    remote_dirs=$(sshpass -p "$MOTDEPASSE" ssh -p $PORT_SSH $UTILISATEUR@$IP_DISTANTE "find /home -maxdepth 1 -type d")
    select rdir in $remote_dirs; do
        if [ -n "$rdir" ]; then
            remote_dest="$rdir"
            break
        else
            echo -e "\e[1;31m❌ Choix invalide, réessayez.\e[0m"
        fi
    done
    echo -e "\e[1;32m[SEND] Envoi du répertoire '$local_dir' vers $UTILISATEUR@$IP_DISTANTE:$remote_dest...\e[0m"
    afficher_progression "$local_dir" "$UTILISATEUR@$IP_DISTANTE:$remote_dest"
}

# ===============================
# Fonctions pour la récupération
# ===============================

interactive_receive_file() {
    echo -e "\e[1;34m[RECEIVE] Liste des répertoires distants (dans /home) :\e[0m"
    remote_dirs=$(sshpass -p "$MOTDEPASSE" ssh -p $PORT_SSH $UTILISATEUR@$IP_DISTANTE "find /home -maxdepth 1 -type d")
    select rdir in $remote_dirs; do
        if [ -n "$rdir" ]; then
            chosen_remote_dir="$rdir"
            break
        else
            echo -e "\e[1;31m❌ Choix invalide, réessayez.\e[0m"
        fi
    done

    echo -e "\e[1;34m[RECEIVE] Liste des fichiers dans '$chosen_remote_dir' (human readable) :\e[0m"
    IFS=$'\n'
    remote_files=( $(sshpass -p "$MOTDEPASSE" ssh -p $PORT_SSH $UTILISATEUR@$IP_DISTANTE "find $chosen_remote_dir -maxdepth 1 -type f -printf '%p (%kK)\n'") )
    unset IFS
    if [ ${#remote_files[@]} -eq 0 ]; then
        echo -e "\e[1;31m❌ Aucun fichier trouvé dans $chosen_remote_dir\e[0m"
        exit 1
    fi
    select rfile in "${remote_files[@]}"; do
        if [ -n "$rfile" ]; then
            remote_file=$(echo "$rfile" | awk '{print $1}')
            break
        else
            echo -e "\e[1;31m❌ Choix invalide, réessayez.\e[0m"
        fi
    done

    echo -e "\e[1;34m[RECEIVE] Liste des répertoires locaux (dans $LOCAL_BASE_DIR) :\e[0m"
    local_dirs=$(find "$LOCAL_BASE_DIR" -maxdepth 1 -type d)
    select ldir in $local_dirs; do
        if [ -n "$ldir" ]; then
            local_dest="$ldir"
            break
        else
            echo -e "\e[1;31m❌ Choix invalide, réessayez.\e[0m"
        fi
    done

    echo -e "\e[1;34m[RECEIVE] Récupération du fichier '$remote_file' vers $local_dest...\e[0m"
    afficher_progression "$UTILISATEUR@$IP_DISTANTE:$remote_file" "$local_dest"
}

interactive_receive_directory() {
    echo -e "\e[1;34m[RECEIVE] Liste des répertoires distants (dans /home) :\e[0m"
    remote_dirs=$(sshpass -p "$MOTDEPASSE" ssh -p $PORT_SSH $UTILISATEUR@$IP_DISTANTE "find /home -maxdepth 1 -type d")
    select rdir in $remote_dirs; do
        if [ -n "$rdir" ]; then
            remote_dir="$rdir"
            break
        else
            echo -e "\e[1;31m❌ Choix invalide, réessayez.\e[0m"
        fi
    done

    echo -e "\e[1;34m[RECEIVE] Liste des répertoires locaux (dans $LOCAL_BASE_DIR) :\e[0m"
    local_dirs=$(find "$LOCAL_BASE_DIR" -maxdepth 1 -type d)
    select ldir in $local_dirs; do
        if [ -n "$ldir" ]; then
            local_dest="$ldir"
            break
        else
            echo -e "\e[1;31m❌ Choix invalide, réessayez.\e[0m"
        fi
    done

    echo -e "\e[1;34m[RECEIVE] Récupération du répertoire '$remote_dir' vers $local_dest...\e[0m"
    afficher_progression "$UTILISATEUR@$IP_DISTANTE:$remote_dir" "$local_dest"
}

# ===============================
# Affichage des exemples de commandes CLI
# ===============================
show_commands_example() {
    echo -e "\e[1;35mExemples de commandes CLI :\e[0m"
    echo -e "1. Envoyer un répertoire :"
    echo -e "   sshpass -p '$MOTDEPASSE' rsync -avzh --progress -e \"ssh -p $PORT_SSH\" /chemin/vers/repertoire $UTILISATEUR@$IP_DISTANTE:/chemin/vers/destination"
    echo -e "2. Envoyer un fichier :"
    echo -e "   sshpass -p '$MOTDEPASSE' rsync -avzh --progress -e \"ssh -p $PORT_SSH\" /chemin/vers/fichier $UTILISATEUR@$IP_DISTANTE:/chemin/vers/destination"
    echo -e "3. Récupérer un répertoire :"
    echo -e "   sshpass -p '$MOTDEPASSE' rsync -avzh --progress -e \"ssh -p $PORT_SSH\" $UTILISATEUR@$IP_DISTANTE:/chemin/vers/répertoire /chemin/vers/destination"
    echo -e "4. Récupérer un fichier :"
    echo -e "   sshpass -p '$MOTDEPASSE' rsync -avzh --progress -e \"ssh -p $PORT_SSH\" $UTILISATEUR@$IP_DISTANTE:/chemin/vers/fichier /chemin/vers/destination"
    exit 0
}

# ===============================
# Mode CLI avec getopts
# ===============================
while getopts "l:f:d:h" opt; do
    case $opt in
        l) LOCAL=$OPTARG ;;
        f) FILE=$OPTARG ;;
        d) DEST=$OPTARG ;;
        h) show_commands_example ;;
        *) show_commands_example ;;
    esac
done

if [ "$#" -gt 0 ]; then
    sshpass -p "$MOTDEPASSE" true > /dev/null
    if [ -n "$FILE" ] && [ -n "$DEST" ]; then
        LOCAL="$FILE"
        echo -e "\e[1;33mMode CLI (envoi de fichier) activé.\e[0m"
        interactive_send_file
        exit 0
    elif [ -n "$LOCAL" ] && [ -n "$DEST" ]; then
        echo -e "\e[1;33mMode CLI (envoi de répertoire) activé.\e[0m"
        interactive_send_directory
        exit 0
    fi
fi

# ===============================
# Mode interactif (aucun argument CLI)
# ===============================
sshpass -p "$MOTDEPASSE" true > /dev/null

echo -e "\e[1;32m1. Envoyer un fichier ou répertoire\e[0m"
echo -e "\e[1;34m2. Récupérer un fichier ou répertoire\e[0m"
echo -e "\e[1;35m3. Afficher les exemples de commandes CLI\e[0m"
read -p "Choisissez une option (1, 2 ou 3) : " choix

case $choix in
    1)
        echo -e "\e[1;32m🔧 Voulez-vous envoyer un fichier ou un répertoire ?\e[0m"
        echo "1. Envoyer un fichier"
        echo "2. Envoyer un répertoire"
        read -p "Choisissez une option (1 ou 2) : " choix_envoi
        if [ "$choix_envoi" -eq 1 ]; then
            interactive_send_file
        elif [ "$choix_envoi" -eq 2 ]; then
            interactive_send_directory
        else
            echo -e "\e[1;31m❌ Option invalide.\e[0m"
        fi
        ;;
    2)
        echo -e "\e[1;34m🔧 Voulez-vous récupérer un fichier ou un répertoire ?\e[0m"
        echo "1. Récupérer un fichier"
        echo "2. Récupérer un répertoire"
        read -p "Choisissez une option (1 ou 2) : " choix_recup
        if [ "$choix_recup" -eq 1 ]; then
            interactive_receive_file
        elif [ "$choix_recup" -eq 2 ]; then
            interactive_receive_directory
        else
            echo -e "\e[1;31m❌ Option invalide.\e[0m"
        fi
        ;;
    3)
        show_commands_example
        ;;
    *)
        echo -e "\e[1;31m❌ Option invalide. Veuillez choisir 1, 2 ou 3.\e[0m"
        ;;
esac
