#!/bin/bash
# =============================================================================
# par2_update.sh
# Script de mise à jour : traite uniquement les fichiers nouveaux ou modifiés
# À exécuter après chaque ajout/modification de données
# Basé sur la comparaison des dates de modification
# Inclut le nettoyage des fichiers de parité orphelins
# =============================================================================

# Configuration
REDONDANCE=10
BASE="${1:-/Volumes/HDD_Externe}"

# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
NC='\033[0m' # No Color

# Vérification du chemin
if [ ! -d "$BASE" ]; then
    echo -e "${RED}Erreur : Le chemin $BASE n'existe pas${NC}"
    exit 1
fi

clear
echo -e "${GREEN}=== Mise à jour par2 ===${NC}"
echo "Chemin : $BASE"
echo "Redondance : ${REDONDANCE}%"
echo ""

# Compteurs
total=0
nouveaux=0
modifies=0
inchanges=0
erreurs=0
fichiers_par2=0
fichiers_systeme=0
fichiers_vides=0
orphelins=0

# Fonction pour vérifier si c'est un fichier système macOS
est_fichier_systeme() {
    local chemin="$1"
    local nom=$(basename "$chemin")
    
    # Fichiers cachés système
    [[ "$nom" == .DS_Store ]] && return 0
    [[ "$nom" == ._* ]] && return 0
    [[ "$nom" == .localized ]] && return 0
    [[ "$nom" == .VolumeIcon.icns ]] && return 0
    [[ "$nom" == .par2_verify_* ]] && return 0
    
    # Dossiers système macOS (et leur contenu)
    [[ "$chemin" == */.Spotlight-V100/* ]] && return 0
    [[ "$chemin" == */.fseventsd/* ]] && return 0
    [[ "$chemin" == */.Trashes/* ]] && return 0
    [[ "$chemin" == */.TemporaryItems/* ]] && return 0
    [[ "$chemin" == */.DocumentRevisions-V100/* ]] && return 0
    [[ "$chemin" == */.com.apple.timemachine.donotpresent ]] && return 0
    [[ "$chemin" == */.apdisk ]] && return 0
    
    return 1
}

# =============================================================================
# PHASE 1 : Mise à jour des parités
# =============================================================================
clear
echo -e "${BLUE}--- Phase 1 : Mise à jour des parités ---${NC}"
echo ""

while IFS= read -r -d '' fichier; do
    ((total++))
    
    # Ignorer les fichiers .par2
    if [[ "$fichier" == *.par2 ]]; then
        ((fichiers_par2++))
        continue
    fi
    
    # Ignorer les fichiers système macOS
    if est_fichier_systeme "$fichier"; then
        ((fichiers_systeme++))
        continue
    fi
    
    # Ignorer les fichiers vides (0 octets)
    if [ ! -s "$fichier" ]; then
        ((fichiers_vides++))
        continue
    fi
    
    par2file="${fichier}.par2"
    
    # Cas 1 : Nouveau fichier (pas de parité existante)
    if [ ! -f "$par2file" ]; then
        echo -e "${GREEN}[NOUVEAU]${NC} $fichier"
        par2 create -r"$REDONDANCE" -n1 "$par2file" "$fichier" > /dev/null 2>&1
        
        if [ $? -eq 0 ]; then
            ((nouveaux++))
            chflags hidden "$par2file" 2>/dev/null
        else
            echo -e "${RED}[ERREUR]${NC} Échec pour $fichier"
            ((erreurs++))
        fi
        continue
    fi
    
    # Cas 2 : Fichier modifié (date fichier > date parité)
    if [ "$fichier" -nt "$par2file" ]; then
        echo -e "${BLUE}[MODIFIÉ]${NC} $fichier"
        
        # Supprimer les anciens fichiers de parité
        rm -f "${fichier}".*.par2 2>/dev/null
        rm -f "$par2file" 2>/dev/null
        
        # Regénérer la parité
        par2 create -r"$REDONDANCE" -n1 "$par2file" "$fichier" > /dev/null 2>&1
        
        if [ $? -eq 0 ]; then
            ((modifies++))
            chflags hidden "$par2file" 2>/dev/null
        else
            echo -e "${RED}[ERREUR]${NC} Échec pour $fichier"
            ((erreurs++))
        fi
        continue
    fi
    
    # Cas 3 : Fichier inchangé
    ((inchanges++))
    
done < <(find "$BASE" -type f -print0)

# =============================================================================
# PHASE 2 : Nettoyage des parités orphelines
# =============================================================================
clear
echo -e "${BLUE}--- Phase 2 : Nettoyage des orphelins ---${NC}"
echo ""

while IFS= read -r -d '' par2file; do
    # Extraire le chemin du fichier original
    original="${par2file%.vol*}"   # Retirer .volXX+YY.par2
    original="${original%.par2}"    # Retirer .par2
    
    # Si le fichier original n'existe plus, supprimer la parité
    if [ ! -f "$original" ]; then
        echo -e "${MAGENTA}[ORPHELIN]${NC} $par2file"
        rm -f "$par2file"
        ((orphelins++))
    fi
done < <(find "$BASE" -type f -name "*.par2" -print0)

# =============================================================================
# PHASE 3 : Masquage des fichiers de parité
# =============================================================================
clear
echo -e "${BLUE}--- Phase 3 : Masquage des fichiers .par2 ---${NC}"
find "$BASE" -name "*.par2" -exec chflags hidden {} \;
echo "Fait."
echo ""


# =============================================================================
# Résumé
# =============================================================================
clear
echo -e "${GREEN}=== Terminé ===${NC}"
echo "Fichiers analysés     : $total"
echo "─────────────────────────────"
echo -e "Nouveaux              : ${GREEN}$nouveaux${NC}"
echo -e "Mis à jour            : ${BLUE}$modifies${NC}"
echo "Inchangés             : $inchanges"
echo -e "Fichiers .par2        : ${YELLOW}$fichiers_par2${NC}"
echo -e "Fichiers système      : ${YELLOW}$fichiers_systeme${NC}"
echo -e "Fichiers vides        : ${YELLOW}$fichiers_vides${NC}"
echo -e "Orphelins supprimés   : ${MAGENTA}$orphelins${NC}"
if [ $erreurs -gt 0 ]; then
    echo -e "Erreurs               : ${RED}$erreurs${NC}"
fi