#!/bin/bash
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0

# Définition de l'URL du script
SCRIPT_URL="https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/scripts/fetch_scripts.sh"
SCRIPT_NAME=$(basename "$0")
TMP_SCRIPT="/tmp/$SCRIPT_NAME"

# Télécharger la dernière version du script
wget -q -O "$TMP_SCRIPT" "$SCRIPT_URL"

# Vérifier si la mise à jour est différente de la version actuelle
if ! cmp -s "$TMP_SCRIPT" "$0"; then
    echo "🔄 Mise à jour du script..."
    mv "$TMP_SCRIPT" "$0"
    chmod +x "$0"
    echo "✅ Script mis à jour ! Redémarrage..."
    exec "$0" "$@"
    exit 0
else
    rm "$TMP_SCRIPT"
fi


# Définition du dépôt et des fichiers de configuration
REPO_URL="https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/scripts"
DIR_LIST_FILE=".directories.txt"
SELECTED_DIRS_FILE=".selected_dirs.txt"
MANDATORY_DIR="common"

# Télécharger la liste des dossiers disponibles
TMP_DIR=$(mktemp -d)
DIR_LIST_PATH="$TMP_DIR/$DIR_LIST_FILE"

wget -q -O "$DIR_LIST_PATH" "$REPO_URL/$DIR_LIST_FILE"

# Vérifier que la liste a bien été téléchargée
if [ ! -s "$DIR_LIST_PATH" ]; then
  echo "❌ Erreur : Impossible de récupérer la liste des dossiers."
  exit 1
fi

# Lire les dossiers disponibles dans un tableau
mapfile -t AVAILABLE_DIRS < "$DIR_LIST_PATH"

# Vérifier qu'il y a bien des dossiers disponibles
if [ ${#AVAILABLE_DIRS[@]} -eq 0 ]; then
  echo "❌ Aucun dossier disponible dans la liste."
  exit 1
fi

# Charger les dossiers précédemment sélectionnés
if [ -f "$SELECTED_DIRS_FILE" ]; then
  mapfile -t PREVIOUS_SELECTION < "$SELECTED_DIRS_FILE"
else
  PREVIOUS_SELECTION=()
fi

# Construire la liste pour whiptail
CHOICES=()
for dir in "${AVAILABLE_DIRS[@]}"; do
  if [ "$dir" == "$MANDATORY_DIR" ]; then
    continue  # Ne pas inclure le dossier obligatoire dans le choix
  fi
  if [[ " ${PREVIOUS_SELECTION[*]} " =~ " $dir " ]]; then
    CHOICES+=("$dir" "" ON)
  else
    CHOICES+=("$dir" "" OFF)
  fi
done

# Affichage du menu de sélection avec whiptail
SELECTED_DIRS=$(whiptail --title "Sélection des dossiers" --checklist \
"Sélectionnez les dossiers à télécharger :" 20 60 10 \
"${CHOICES[@]}" 3>&1 1>&2 2>&3)

# Vérifier si l'utilisateur a annulé
if [ $? -ne 0 ]; then
  echo "❌ Annulation par l'utilisateur."
  exit 1
fi

# Convertir la sélection en tableau
SELECTED_DIRS_ARRAY=("$MANDATORY_DIR" $(echo "$SELECTED_DIRS" | tr -d '"'))

# Enregistrer la sélection actuelle
echo "${SELECTED_DIRS_ARRAY[@]}" > "$SELECTED_DIRS_FILE"

# Identifier les dossiers à supprimer (ceux qui ne sont plus sélectionnés)
for dir in "${PREVIOUS_SELECTION[@]}"; do
  if [[ ! " ${SELECTED_DIRS_ARRAY[*]} " =~ " $dir " ]]; then
    echo "🗑 Suppression du dossier $dir..."
    rm -rf "$dir"
  fi
done

# Télécharger ou mettre à jour les fichiers pour chaque dossier sélectionné
for TARGET_DIR in "${SELECTED_DIRS_ARRAY[@]}"; do
  LIST_FILE=".list_files.txt"
  LIST_PATH="$TMP_DIR/$LIST_FILE"

  echo "🔹 Récupération des scripts de '$TARGET_DIR'..."

  # Télécharger la liste des fichiers
  wget -q -O "$LIST_PATH" "$REPO_URL/$TARGET_DIR/$LIST_FILE"

  if [ ! -s "$LIST_PATH" ]; then
    echo "❌ Erreur : Impossible de récupérer la liste des fichiers pour $TARGET_DIR."
    continue
  fi

  # Création du répertoire s'il n'existe pas
  mkdir -p "$TARGET_DIR"

  # Télécharger chaque fichier listé
  while read -r file; do
    FILE_NAME=$(basename "$file")
    FILE_PATH="$TARGET_DIR/$FILE_NAME"

    if [ -f "$FILE_PATH" ]; then
      echo "  ↻ Mise à jour de $FILE_NAME..."
    else
      echo "  ↳ Téléchargement de $FILE_NAME..."
    fi
    wget -q -O "$FILE_PATH" "$REPO_URL/$TARGET_DIR/$file"
  done < "$LIST_PATH"

  # Supprimer les fichiers obsolètes
  for existing_file in "$TARGET_DIR"/*; do
    if [ -f "$existing_file" ] && ! grep -qx "$(basename "$existing_file")" "$LIST_PATH"; then
      echo "  🗑 Suppression de $(basename "$existing_file")..."
      rm "$existing_file"
    fi
  done

  # Rendre exécutables les scripts téléchargés
  chmod +x "$TARGET_DIR"/*.sh

  echo "✅ Scripts de '$TARGET_DIR' mis à jour avec succès."
done

# Nettoyage
rm -rf "$TMP_DIR"

echo "🚀 Tous les scripts sélectionnés ont été mis à jour et sont exécutables."

