#!/bin/bash

# Script de permissions Laravel pour PRODUCTION
# Version sécurisée avec permissions minimales
# Usage: sudo ./fix-permissions-production.sh

echo "🔒 Configuration des permissions Laravel pour PRODUCTION..."

# Définir les variables
WEBUSER="www-data"
WEBGROUP="www-data"
APPUSER="laravel"  # Utilisateur dédié pour les tâches Laravel

# Vérifier que le script est exécuté en tant que root
if [ "$EUID" -ne 0 ]; then
    echo "❌ Ce script doit être exécuté avec sudo"
    exit 1
fi

# Créer un utilisateur dédié pour Laravel si il n'existe pas
if ! id "$APPUSER" &>/dev/null; then
    echo "👤 Création de l'utilisateur $APPUSER..."
    useradd -r -s /bin/bash -d /var/www/html -G $WEBGROUP $APPUSER
    echo "✅ Utilisateur $APPUSER créé"
fi

# Ajouter l'utilisateur laravel au groupe www-data
usermod -a -G $WEBGROUP $APPUSER

# Ajouter l'utilisateur ubuntu au groupe www-data pour les tests dev
usermod -a -G $WEBGROUP ubuntu

echo "📂 Configuration des permissions de base..."

# Propriétaire de base : www-data pour tout
chown -R $WEBUSER:$WEBGROUP .

# Permissions de base sécurisées
find . -type f -exec chmod 644 {} \;  # Fichiers : lecture/écriture propriétaire, lecture groupe
find . -type d -exec chmod 755 {} \;  # Dossiers : accès complet propriétaire, lecture/exécution groupe

# Permissions spéciales pour storage (écriture groupe nécessaire)
echo "🗂️ Configuration storage/ avec permissions sécurisées..."
chmod -R 775 storage/
chmod -R 775 bootstrap/cache/

# S'assurer que tous les futurs fichiers dans storage auront les bonnes permissions (setgid)
find storage/ -type d -exec chmod g+s {} \;
find bootstrap/cache/ -type d -exec chmod g+s {} \;

# Permissions optimales pour les sous-dossiers de cache spécifiques
echo "💾 Configuration spécifique des dossiers de cache..."
chmod 775 storage/framework/cache/ 2>/dev/null || mkdir -p storage/framework/cache && chmod 775 storage/framework/cache/
chmod 775 storage/framework/sessions/ 2>/dev/null || mkdir -p storage/framework/sessions && chmod 775 storage/framework/sessions/
chmod 775 storage/framework/views/ 2>/dev/null || mkdir -p storage/framework/views && chmod 775 storage/framework/views/

# Configurer les ACL pour une meilleure gestion des permissions (si disponible)
if command -v setfacl &> /dev/null; then
    echo "🔐 Configuration des ACL pour les cache..."
    setfacl -R -m g:$WEBGROUP:rwx storage/framework/cache/ 2>/dev/null || true
    setfacl -R -m g:$WEBGROUP:rwx storage/framework/sessions/ 2>/dev/null || true
    setfacl -R -m g:$WEBGROUP:rwx storage/framework/views/ 2>/dev/null || true
    setfacl -R -m g:$WEBGROUP:rwx bootstrap/cache/ 2>/dev/null || true
    
    # ACL par défaut pour les nouveaux fichiers
    setfacl -R -d -m g:$WEBGROUP:rwx storage/framework/cache/ 2>/dev/null || true
    setfacl -R -d -m g:$WEBGROUP:rwx storage/framework/sessions/ 2>/dev/null || true
    setfacl -R -d -m g:$WEBGROUP:rwx storage/framework/views/ 2>/dev/null || true
    setfacl -R -d -m g:$WEBGROUP:rwx bootstrap/cache/ 2>/dev/null || true
fi

# Permissions pour sitemaps (écriture groupe nécessaire)
echo "🗺️ Configuration sitemaps/ avec permissions sécurisées..."
if [ -d "public/sitemaps" ]; then
    chmod -R 775 public/sitemaps/
    chown -R $WEBUSER:$WEBGROUP public/sitemaps/
else
    mkdir -p public/sitemaps
    chmod 775 public/sitemaps/
    chown $WEBUSER:$WEBGROUP public/sitemaps/
fi

# Permissions pour le sitemap principal
if [ -f "public/sitemap.xml" ]; then
    chmod 664 public/sitemap.xml
    chown $WEBUSER:$WEBGROUP public/sitemap.xml
fi

# Artisan exécutable
chmod +x artisan

# Scripts exécutables
chmod +x *.sh 2>/dev/null || true

# Sécurisation des fichiers sensibles
echo "🔐 Sécurisation des fichiers sensibles..."
chmod 640 .env* 2>/dev/null || true
chmod 640 config/*.php
chown $WEBUSER:$WEBGROUP .env* 2>/dev/null || true

echo "✅ Permissions PRODUCTION configurées avec succès !"
echo ""
echo "📋 Configuration appliquée :"
echo "   • Utilisateur dédié: $APPUSER (membre du groupe $WEBGROUP)"
echo "   • Fichiers: 644 (rw-r--r--)"
echo "   • Dossiers: 755 (rwxr-xr-x)"
echo "   • Storage: 775 (rwxrwxr-x)"
echo "   • Bootstrap/cache: 775 (rwxrwxr-x)"
echo "   • Sitemaps: 775 (rwxrwxr-x)"
echo "   • .env: 640 (rw-r-----)"
echo ""
echo "🔄 Configuration du cron pour l'utilisateur $APPUSER :"
echo "   sudo crontab -u $APPUSER -e"
echo "   * * * * * cd /var/www/html && php artisan schedule:run >> /dev/null 2>&1"
