#!/bin/bash
# =============================================================================
# Script de correction des permissions des dossiers d'upload
# Kohinos - Branding, Logo, Favicon, OG Image
#
# Utilise les meilleures pratiques Symfony :
# - Propriétaire : www-data (serveur web)
# - Groupe : www-data (partagé avec l'utilisateur de dev)
# - Permissions dossiers : 775 (rwxrwxr-x)
# - Permissions fichiers : 664 (rw-rw-r--)
# - ACL pour permettre à l'utilisateur courant d'écrire aussi
#
# Usage: sudo bash scripts/fix-upload-permissions.sh
# =============================================================================

set -e

# Vérifier si on est root
if [ "$EUID" -ne 0 ]; then
    echo "Ce script doit être exécuté avec sudo :"
    echo "  sudo bash $0"
    exit 1
fi

# 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

# Utilisateur web (Apache/Nginx)
WEB_USER="www-data"
WEB_GROUP="www-data"

# Utilisateur de développement (celui qui a lancé sudo)
DEV_USER="${SUDO_USER:-$(whoami)}"

# Répertoire racine du projet (parent du script)
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
PUBLIC_DIR="$PROJECT_DIR/public"
UPLOAD_DIR="$PUBLIC_DIR/upload"

echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}  Correction des permissions d'upload  ${NC}"
echo -e "${BLUE}  (Meilleures pratiques Symfony)       ${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""

# Vérifier que le dossier public existe
if [ ! -d "$PUBLIC_DIR" ]; then
    echo -e "${RED}❌ Erreur: Le dossier public n'existe pas: $PUBLIC_DIR${NC}"
    exit 1
fi

echo -e "${YELLOW}📁 Répertoire projet: $PROJECT_DIR${NC}"
echo -e "${YELLOW}📁 Répertoire upload: $UPLOAD_DIR${NC}"
echo -e "${YELLOW}👤 Utilisateur web: $WEB_USER${NC}"
echo -e "${YELLOW}👤 Utilisateur dev: $DEV_USER${NC}"
echo ""

# Liste des sous-dossiers d'upload à créer/configurer
UPLOAD_SUBDIRS=(
    "branding"   # Dossier de base pour le branding
    "logo"       # Logos de la MLC
    "favicon"    # Favicons générés
    "og"         # Images Open Graph pour partage social
    "media"      # Médias généraux (Sonata)
)

# Créer le dossier upload principal s'il n'existe pas
if [ ! -d "$UPLOAD_DIR" ]; then
    echo -e "${YELLOW}📁 Création du dossier upload principal...${NC}"
    mkdir -p "$UPLOAD_DIR"
fi

# Créer et configurer chaque sous-dossier
for subdir in "${UPLOAD_SUBDIRS[@]}"; do
    FULL_PATH="$UPLOAD_DIR/$subdir"

    if [ ! -d "$FULL_PATH" ]; then
        echo -e "${GREEN}✅ Création: $subdir${NC}"
        mkdir -p "$FULL_PATH"
    else
        echo -e "${BLUE}📂 Existe déjà: $subdir${NC}"
    fi
done

echo ""

# Vérifier si www-data existe
if ! id "$WEB_USER" &>/dev/null; then
    echo -e "${RED}❌ Erreur: L'utilisateur $WEB_USER n'existe pas${NC}"
    exit 1
fi

# =============================================================================
# Méthode 1 : Propriétaire www-data + ACL pour l'utilisateur de dev
# =============================================================================
echo -e "${YELLOW}� Application des permissions Symfony...${NC}"
echo ""

# 1. Changer le propriétaire vers www-data:www-data
echo -e "${YELLOW}  1/4 - Changement propriétaire vers $WEB_USER:$WEB_GROUP...${NC}"
chown -R "$WEB_USER:$WEB_GROUP" "$UPLOAD_DIR"
echo -e "${GREEN}      ✅ Propriétaire: $WEB_USER:$WEB_GROUP${NC}"

# 2. Permissions de base : 775 pour dossiers, 664 pour fichiers
echo -e "${YELLOW}  2/4 - Permissions dossiers (775)...${NC}"
find "$UPLOAD_DIR" -type d -exec chmod 775 {} \;
echo -e "${GREEN}      ✅ Dossiers: rwxrwxr-x (775)${NC}"

echo -e "${YELLOW}  3/4 - Permissions fichiers (664)...${NC}"
find "$UPLOAD_DIR" -type f -exec chmod 664 {} \;
echo -e "${GREEN}      ✅ Fichiers: rw-rw-r-- (664)${NC}"

# 3. Ajouter l'utilisateur de dev au groupe www-data (si pas déjà membre)
echo -e "${YELLOW}  4/4 - Configuration ACL pour $DEV_USER...${NC}"

# Vérifier si setfacl est disponible
if command -v setfacl &> /dev/null; then
    # Utiliser les ACL pour donner accès à l'utilisateur de dev
    # ACL par défaut pour les nouveaux fichiers/dossiers
    setfacl -R -m u:"$DEV_USER":rwX "$UPLOAD_DIR"
    setfacl -R -d -m u:"$DEV_USER":rwX "$UPLOAD_DIR"

    # ACL pour www-data aussi (assure les permissions futures)
    setfacl -R -m u:"$WEB_USER":rwX "$UPLOAD_DIR"
    setfacl -R -d -m u:"$WEB_USER":rwX "$UPLOAD_DIR"

    echo -e "${GREEN}      ✅ ACL configurées pour $DEV_USER et $WEB_USER${NC}"
else
    echo -e "${YELLOW}      ⚠️  setfacl non disponible, ajout de $DEV_USER au groupe $WEB_GROUP...${NC}"

    # Fallback: ajouter l'utilisateur au groupe www-data
    if ! groups "$DEV_USER" | grep -q "$WEB_GROUP"; then
        usermod -aG "$WEB_GROUP" "$DEV_USER"
        echo -e "${GREEN}      ✅ $DEV_USER ajouté au groupe $WEB_GROUP${NC}"
        echo -e "${YELLOW}      ⚠️  Vous devez vous déconnecter/reconnecter pour appliquer${NC}"
    else
        echo -e "${GREEN}      ✅ $DEV_USER déjà membre de $WEB_GROUP${NC}"
    fi
fi

echo ""
echo -e "${BLUE}========================================${NC}"
echo -e "${GREEN}✅ Permissions corrigées avec succès !${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""

# Afficher l'état final
echo -e "${YELLOW}📋 État final des dossiers:${NC}"
ls -la "$UPLOAD_DIR"

echo ""
echo -e "${YELLOW}📋 ACL (si disponibles):${NC}"
if command -v getfacl &> /dev/null; then
    getfacl "$UPLOAD_DIR" 2>/dev/null | head -15
fi

echo ""
echo -e "${GREEN}🎉 Terminé !${NC}"
echo ""
echo -e "${YELLOW}Résumé des permissions appliquées :${NC}"
echo -e "  - Propriétaire: ${GREEN}$WEB_USER:$WEB_GROUP${NC}"
echo -e "  - Dossiers: ${GREEN}775 (rwxrwxr-x)${NC}"
echo -e "  - Fichiers: ${GREEN}664 (rw-rw-r--)${NC}"
echo -e "  - ACL: ${GREEN}$DEV_USER et $WEB_USER ont accès en écriture${NC}"
