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

umask 077

# Configuration locale facultative. Le script reste utilisable sans NAS :
# dans ce cas, seule la sauvegarde locale est créée.
CONFIG_FILE="${JARVIS_CONFIG:-$HOME/.config/jarvis/jarvis.env}"
if [[ -r "$CONFIG_FILE" ]]; then
    set -a
    # shellcheck disable=SC1090
    . "$CONFIG_FILE"
    set +a
fi

BACKUP_DIR="${JARVIS_BACKUP_DIR:-$HOME/jarvis-backups}"
NFS_DIR="${JARVIS_NFS_MOUNT:-}"
RETENTION_DAYS="${JARVIS_BACKUP_RETENTION_DAYS:-14}"

HOST="$(hostname -s)"
STAMP="$(date +%Y%m%d-%H%M%S)"

ARCHIVE="$BACKUP_DIR/jarvis-${HOST}-${STAMP}.tar.gz"
CHECKSUM="${ARCHIVE}.sha256"

mkdir -p "$BACKUP_DIR"

echo "=================================================="
echo "  JARVIS BACKUP"
echo "=================================================="
echo
echo "Backup local : $ARCHIVE"

tar -C "$HOME" \
    --exclude='.hermes/hermes-agent' \
    --exclude='.hermes/cache' \
    --exclude='.hermes/tmp' \
    -czf "$ARCHIVE" \
    .hermes \
    .local/bin/jarvis-health \
    .local/bin/jarvis-system-info \
    .config/systemd/user

chmod 600 "$ARCHIVE"

sha256sum "$ARCHIVE" > "$CHECKSUM"
chmod 600 "$CHECKSUM"

echo
echo "[1/4] Vérification SHA-256 locale..."
sha256sum -c "$CHECKSUM"

echo
echo "[2/4] Vérification de l'archive..."
tar -tzf "$ARCHIVE" >/dev/null
echo "Archive : OK"

echo
echo "[3/4] Copie vers le NAS NFS..."

if [[ -n "$NFS_DIR" ]] && \
   [[ "$NFS_DIR" != *"METTRE_VOTRE_"* ]] && \
   findmnt -T "$NFS_DIR" >/dev/null 2>&1 && [[ -d "$NFS_DIR" ]]; then

    if [ -w "$NFS_DIR" ]; then
        cp -p "$ARCHIVE" "$NFS_DIR/"
        cp -p "$CHECKSUM" "$NFS_DIR/"

        REMOTE_ARCHIVE="$NFS_DIR/$(basename "$ARCHIVE")"
        REMOTE_CHECKSUM="$NFS_DIR/$(basename "$CHECKSUM")"

        echo "Copie NFS terminée."

        echo
        echo "Vérification SHA-256 sur le NAS..."

        (
            cd "$NFS_DIR"
            sha256sum -c "$(basename "$REMOTE_CHECKSUM")"
        )

        echo "Backup NAS : OK"

        echo
        echo "Nettoyage des backups NAS de plus de ${RETENTION_DAYS} jours..."

        find "$NFS_DIR" \
            -maxdepth 1 \
            -type f \
            \( -name 'jarvis-*.tar.gz' -o -name 'jarvis-*.tar.gz.sha256' \) \
            -mtime "+$RETENTION_DAYS" \
            -delete

    else
        echo "ATTENTION : le NFS est monté mais le dossier n'est pas accessible en écriture."
        echo "Le backup local reste valide."
    fi

else
    if [[ -z "$NFS_DIR" || "$NFS_DIR" == *"METTRE_VOTRE_"* ]]; then
        echo "ATTENTION : JARVIS_NFS_MOUNT n'est pas configuré."
    else
        echo "ATTENTION : le partage NFS n'est pas monté sur $NFS_DIR."
    fi
    echo "Le backup local reste valide."
fi

echo
echo "[4/4] Nettoyage des backups locaux de plus de ${RETENTION_DAYS} jours..."

find "$BACKUP_DIR" \
    -type f \
    \( -name 'jarvis-*.tar.gz' -o -name 'jarvis-*.tar.gz.sha256' \) \
    -mtime "+$RETENTION_DAYS" \
    -delete

echo
echo "=================================================="
echo "  BACKUP TERMINE"
echo "=================================================="

echo
echo "Local :"
ls -lh "$ARCHIVE" "$CHECKSUM"

if [[ -n "$NFS_DIR" ]] && [[ -f "$NFS_DIR/$(basename "$ARCHIVE")" ]]; then
    echo
    echo "NAS :"
    ls -lh \
        "$NFS_DIR/$(basename "$ARCHIVE")" \
        "$NFS_DIR/$(basename "$CHECKSUM")"
fi
