#!/bin/bash
# =============================================================================
# par2_verify.sh
# Script de vérification trimestrielle : vérifie l'intégrité et répare si besoin
# À exécuter tous les 3 mois pour détecter le bit rot
# =============================================================================

# Configuration
BASE="${1:-/Volumes/HDD_Externe}"
LOG_FILE="${BASE}/.par2_verify_$(date +%Y%m%d_%H%M%S).log"
AUTO_REPAIR="${2:-no}"  # Passer "repair" en 2e argument pour réparation auto

# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
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}=== Vérification par2 ===${NC}"
echo "Chemin : $BASE"
echo "Log : $LOG_FILE"
echo "Réparation auto : $AUTO_REPAIR"
echo ""

# Compteurs
total=0
ok=0
corrompus=0
repares=0
sans_parite=0
fichiers_systeme=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
}

# Initialisation du log
clear
echo "=== Vérification par2 - $(date) ===" > "$LOG_FILE"
echo "Chemin : $BASE" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"

# Parcours récursif de tous les fichiers
while IFS= read -r -d '' fichier; do
    # Ignorer les fichiers .par2
    if [[ "$fichier" == *.par2 ]]; then
        continue
    fi
    
    # Ignorer les fichiers système macOS
    if est_fichier_systeme "$fichier"; then
        ((fichiers_systeme++))
        continue
    fi
    
    ((total++))
    par2file="${fichier}.par2"
    
    # Vérifier si la parité existe
    if [ ! -f "$par2file" ]; then
        echo -e "${YELLOW}[SANS PARITÉ]${NC} $fichier"
        echo "[SANS PARITÉ] $fichier" >> "$LOG_FILE"
        ((sans_parite++))
        continue
    fi
    
    # Vérification
    resultat=$(par2 verify "$par2file" 2>&1)
    
    if echo "$resultat" | grep -q "All files are correct"; then
        echo -e "${GREEN}[OK]${NC} $fichier"
        ((ok++))
    else
        echo -e "${RED}[CORROMPU]${NC} $fichier"
        echo "[CORROMPU] $fichier" >> "$LOG_FILE"
        ((corrompus++))
        
        # Réparation automatique si demandée
        if [ "$AUTO_REPAIR" = "repair" ]; then
            echo -e "${BLUE}[RÉPARATION]${NC} $fichier"
            par2 repair "$par2file" > /dev/null 2>&1
            
            if [ $? -eq 0 ]; then
                echo -e "${GREEN}[RÉPARÉ]${NC} $fichier"
                echo "[RÉPARÉ] $fichier" >> "$LOG_FILE"
                ((repares++))
            else
                echo -e "${RED}[ÉCHEC RÉPARATION]${NC} $fichier"
                echo "[ÉCHEC RÉPARATION] $fichier" >> "$LOG_FILE"
            fi
        fi
    fi
    
done < <(find "$BASE" -type f -print0)

# Résumé
echo ""
echo -e "${GREEN}=== Résumé ===${NC}"
echo "Fichiers vérifiés     : $total"
echo "─────────────────────────────"
echo -e "Intègres              : ${GREEN}$ok${NC}"
echo -e "Corrompus             : ${RED}$corrompus${NC}"
echo -e "Réparés               : ${BLUE}$repares${NC}"
echo -e "Sans parité           : ${YELLOW}$sans_parite${NC}"
echo -e "Fichiers système      : ${YELLOW}$fichiers_systeme${NC} (ignorés)"

# Log du résumé
echo "" >> "$LOG_FILE"
echo "=== Résumé ===" >> "$LOG_FILE"
echo "Fichiers vérifiés : $total" >> "$LOG_FILE"
echo "Intègres : $ok" >> "$LOG_FILE"
echo "Corrompus : $corrompus" >> "$LOG_FILE"
echo "Réparés : $repares" >> "$LOG_FILE"
echo "Sans parité : $sans_parite" >> "$LOG_FILE"
echo "Fichiers système ignorés : $fichiers_systeme" >> "$LOG_FILE"

# Cacher le fichier log
chflags hidden "$LOG_FILE" 2>/dev/null

# Alerte si corruptions non réparées
if [ $corrompus -gt $repares ]; then
    echo ""
    echo -e "${RED}ATTENTION : Des fichiers corrompus n'ont pas été réparés !${NC}"
    echo "Consultez le log : $LOG_FILE"
    exit 1
fi

exit 0