#!/bin/bash

# Script de correction automatique des permissions des cache Laravel
# Exécuté automatiquement par le cron root (toutes les heures)
# Usage: ./fix-cache-permissions.sh
#
# IMPORTANT: Ce script ne fait des corrections que si nécessaire.
# Il accepte 775 et 2775 (setgid) comme permissions valides pour les répertoires.

WEBUSER="www-data"
WEBGROUP="www-data"
LARAVEL_DIR="/var/www/html"

# Fonction pour logger avec timestamp
log_with_timestamp() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

# Vérifier si nous sommes dans le bon répertoire
if [ ! -f "$LARAVEL_DIR/artisan" ]; then
    log_with_timestamp "❌ ERREUR: Répertoire Laravel non trouvé à $LARAVEL_DIR"
    exit 1
fi

cd "$LARAVEL_DIR"

# Fonction pour vérifier si les permissions d'un répertoire sont acceptables (775 ou 2775)
perms_ok() {
    local perms=$(stat -c "%a" "$1" 2>/dev/null)
    [[ "$perms" == "775" || "$perms" == "2775" ]]
}

# Fonction pour corriger un répertoire uniquement si nécessaire
# Ne corrige que les fichiers avec de mauvaises permissions (pas tout récursivement)
fix_dir_if_needed() {
    local dir="$1"
    if [ ! -d "$dir" ]; then
        return
    fi

    # Vérifier le propriétaire du répertoire
    local owner=$(stat -c "%U" "$dir")
    if [ "$owner" != "$WEBUSER" ]; then
        log_with_timestamp "📂 Correction owner $dir: $owner -> $WEBUSER"
        chown $WEBUSER:$WEBGROUP "$dir"
    fi

    # Vérifier les permissions du répertoire parent
    if ! perms_ok "$dir"; then
        local current=$(stat -c "%a" "$dir")
        log_with_timestamp "📂 Correction $dir: $current -> 2775"
        chmod 2775 "$dir"
    fi

    # Corriger SEULEMENT les fichiers avec mauvais propriétaire (pas tout)
    local bad_owner_count=$(find "$dir" -maxdepth 3 ! -user $WEBUSER -type f 2>/dev/null | head -100 | wc -l)
    if [ "$bad_owner_count" -gt 0 ]; then
        log_with_timestamp "📂 Correction owner: $bad_owner_count fichiers dans $dir"
        find "$dir" ! -user $WEBUSER -exec chown $WEBUSER:$WEBGROUP {} + 2>/dev/null
    fi

    # Corriger SEULEMENT les fichiers avec permissions != 664 (limité pour éviter surcharge I/O)
    local bad_perm_count=$(find "$dir" -maxdepth 3 -type f ! -perm 664 2>/dev/null | head -100 | wc -l)
    if [ "$bad_perm_count" -gt 0 ]; then
        log_with_timestamp "📂 Correction permissions: $bad_perm_count fichiers dans $dir"
        # Traiter par batch avec ionice pour ne pas bloquer PHP-FPM
        find "$dir" -type f ! -perm 664 -print0 2>/dev/null | ionice -c3 xargs -0 -r chmod 664 2>/dev/null
    fi
}

log_with_timestamp "🔧 Vérification des permissions des cache Laravel..."

# Corriger les répertoires critiques uniquement si nécessaire
fix_dir_if_needed "storage/framework/cache"
fix_dir_if_needed "storage/framework/sessions"
fix_dir_if_needed "storage/framework/views"
fix_dir_if_needed "bootstrap/cache"
fix_dir_if_needed "storage/logs"
fix_dir_if_needed "public/sitemaps"

log_with_timestamp "✅ Vérification des permissions terminée"

# Vérifier l'espace disque des logs
LOG_SIZE=$(du -sh storage/logs 2>/dev/null | cut -f1)
if [ -n "$LOG_SIZE" ]; then
    log_with_timestamp "📊 Taille des logs: $LOG_SIZE"
fi

# Nettoyer les anciens fichiers cache si trop volumineux (>500MB)
# Les fichiers cache Laravel sont des hashes SANS extension (pas .php)
CACHE_SIZE=$(du -s storage/framework/cache 2>/dev/null | cut -f1)
if [ -n "$CACHE_SIZE" ] && [ "$CACHE_SIZE" -gt 512000 ]; then
    log_with_timestamp "🧹 Cache volumineux ($(($CACHE_SIZE/1024))MB), nettoyage fichiers > 30 jours..."
    # Supprimer les fichiers cache de plus de 30 jours avec ionice pour limiter l'impact I/O
    find storage/framework/cache/data -type f -mtime +30 -print0 2>/dev/null | ionice -c3 xargs -0 -r rm -f 2>/dev/null
    # Nettoyer les répertoires vides
    find storage/framework/cache/data -type d -empty -delete 2>/dev/null
    NEW_CACHE_SIZE=$(du -s storage/framework/cache 2>/dev/null | cut -f1)
    log_with_timestamp "✅ Nettoyage terminé: $(($CACHE_SIZE/1024))MB -> $(($NEW_CACHE_SIZE/1024))MB"
fi