#!/usr/bin/env bash
set -euo pipefail

# --------- PARAMÈTRES À ADAPTER SI BESOIN ---------
MIGRATE_ROOT="/mnt/zfs-migrate"        # point de montage temporaire
POOL_DATA_DATASET="mypool1/data"       # dataset parent
# ---------------------------------------------------

usage() {
  echo "Usage: $0 /chemin/source (ex: /mypool1/data/shared)" >&2
  exit 1
}

if [[ $# -ne 1 ]]; then
  usage
fi

SRC="$1"

# On force un chemin absolu propre
SRC="$(readlink -f "$SRC")"

if [[ ! -d "$SRC" ]]; then
  echo "Erreur: $SRC n'est pas un répertoire existant." >&2
  exit 1
fi

# Vérifier qu'on est bien sous /mypool1/data
PARENT="$(dirname "$SRC")"
BASENAME="$(basename "$SRC")"

if [[ "$PARENT" != "/mypool1/data" ]]; then
  echo "Erreur: le répertoire source doit être directement sous /mypool1/data" >&2
  echo "Ex: /mypool1/data/shared, /mypool1/data/software, etc." >&2
  exit 1
fi

DATASET="${POOL_DATA_DATASET}/${BASENAME}"
TMP_MOUNT="${MIGRATE_ROOT}/${BASENAME}"
OLD_DIR="${SRC}.old"

echo "=== Migration du dossier -> dataset ZFS ==="
echo " Source     : $SRC"
echo " Dataset    : $DATASET"
echo " Tmp mount  : $TMP_MOUNT"
echo " Ancienne copie (backup): $OLD_DIR"
echo

# Vérifs de sécurité
if zfs list -H "$DATASET" >/dev/null 2>&1; then
  echo "Erreur: le dataset ZFS $DATASET existe déjà." >&2
  exit 1
fi

if [[ -e "$OLD_DIR" ]]; then
  echo "Erreur: $OLD_DIR existe déjà. Renomme-le ou supprime-le avant de continuer." >&2
  exit 1
fi

sudo mkdir -p "$MIGRATE_ROOT"

echo ">>> Création du dataset $DATASET avec mountpoint temporaire $TMP_MOUNT"
sudo zfs create -o mountpoint="$TMP_MOUNT" "$DATASET"

echo ">>> Application des propriétés (compression zstd-3, atime=off)"
sudo zfs set compression=zstd-3 "$DATASET"
sudo zfs set atime=off "$DATASET"

echo
echo ">>> Pré-copie des données (services peuvent encore tourner)"
sudo rsync -avxHAX "$SRC"/ "$TMP_MOUNT"/

echo
echo "=== PAUSE 1 ==="
echo "La pré-copie est terminée."
echo "- Tu peux vérifier le contenu dans $TMP_MOUNT"
echo "- Tu dois maintenant arrêter/figer les services qui écrivent dans $SRC"
read -r -p "Quand tu es prêt pour la sync finale, appuie sur Entrée (Ctrl-C pour annuler) : " _

echo
echo ">>> Sync finale (avec --delete)"
sudo rsync -avxHAX --delete "$SRC"/ "$TMP_MOUNT"/

echo
echo "=== PAUSE 2 ==="
echo "La sync finale est terminée."
echo "On va maintenant :"
echo " 1) Renommer $SRC en $OLD_DIR"
echo " 2) Mettre le mountpoint du dataset sur $SRC"
read -r -p "Confirmer la bascule ? (Entrée pour continuer, Ctrl-C pour annuler) : " _

echo
echo ">>> Renommage de l'ancien répertoire"
sudo mv "$SRC" "$OLD_DIR"

echo ">>> Bascule du mountpoint du dataset sur $SRC"
sudo zfs set mountpoint="$SRC" "$DATASET"
# Pas besoin de 'zfs mount' : ZFS monte automatiquement

echo
echo "=== Résumé ==="
sudo zfs list -o name,mountpoint "$DATASET"
ls -ld "$SRC" "$OLD_DIR"
df -h "$SRC" || true

echo
echo "Vérifie maintenant que tout fonctionne bien avec le nouveau dataset :"
echo " - chemins identiques pour tes services ($SRC)"
echo " - données présentes et cohérentes"
echo
echo "Quand tu seras sûr de toi, tu pourras supprimer l'ancienne copie :"
echo "  sudo rm -rf \"$OLD_DIR\""
echo
echo "Migration terminée (à valider par tes soins)."
