#!/bin/bash

# Script pour migrer le cron Laravel de l'utilisateur 'laravel' vers 'root'
# et configurer les permissions appropriées
# Usage: sudo ./migrate-cron-to-root.sh

echo "🔄 Migration du cron Laravel vers root..."

WEBUSER="www-data"
WEBGROUP="www-data"

# 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

# Vérifier si cette instance doit exécuter les tâches cron
echo "🔍 Vérification du ServerName de l'instance EC2..."

# Obtenir un token pour IMDSv2
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" -s --max-time 5 2>/dev/null)

if [ -z "$TOKEN" ]; then
    echo "⚠️ Métadonnées EC2 non disponibles (IMDSv2 non accessible)"
    
    # Utiliser une variable d'environnement pour le test local
    if [ -n "$LOCAL_SERVER_NAME" ]; then
        SERVER_NAME="$LOCAL_SERVER_NAME"
        echo "🏷️ ServerName (local): $SERVER_NAME"
    else
        echo "❌ Pour tester en local, définissez: export LOCAL_SERVER_NAME=prod_1"
        echo "❌ Ou vérifiez la configuration IMDSv2 de l'instance EC2"
        exit 1
    fi
else
    # Obtenir l'instance ID avec IMDSv2
    INSTANCE_ID=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s --max-time 5 http://169.254.169.254/latest/meta-data/instance-id 2>/dev/null)
    
    if [ -z "$INSTANCE_ID" ]; then
        echo "❌ Impossible d'obtenir l'instance ID"
        exit 1
    fi

    echo "📍 Instance ID: $INSTANCE_ID"

    # Obtenir la région avec IMDSv2
    REGION=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s --max-time 5 http://169.254.169.254/latest/meta-data/placement/region 2>/dev/null)
    if [ -z "$REGION" ]; then
        REGION="eu-west-1"  # Région par défaut
    fi

    echo "🌍 Région: $REGION"

    # Utiliser AWS CLI pour obtenir le tag ServerName
    SERVER_NAME=$(aws ec2 describe-tags --region "$REGION" --filters "Name=resource-id,Values=$INSTANCE_ID" "Name=key,Values=ServerName" --query 'Tags[0].Value' --output text 2>/dev/null)

    if [ "$SERVER_NAME" = "None" ] || [ -z "$SERVER_NAME" ]; then
        echo "❌ Tag ServerName non trouvé sur l'instance EC2"
        echo "Veuillez ajouter le tag 'ServerName' avec la valeur 'prod_1' ou 'dev_1'"
        exit 1
    fi

    echo "🏷️ ServerName: $SERVER_NAME"
fi

# Vérifier si cette instance doit exécuter les tâches cron
if [ "$SERVER_NAME" != "prod_1" ] && [ "$SERVER_NAME" != "dev_1" ]; then
    echo "⏭️ Cette instance ($SERVER_NAME) n'est pas configurée pour exécuter les tâches cron"
    echo "Seules les instances avec ServerName = 'prod_1' ou 'dev_1' exécutent les tâches planifiées"
    echo "✅ Configuration ignorée - pas d'action requise"
    exit 0
fi

echo "✅ Cette instance ($SERVER_NAME) est autorisée à exécuter les tâches cron"

# Étape 1: Supprimer l'ancien cron de l'utilisateur laravel
echo "🗑️ Suppression de l'ancien cron de l'utilisateur laravel..."
if id "laravel" &>/dev/null; then
    crontab -u laravel -r 2>/dev/null || echo "Aucun cron à supprimer pour laravel"
    echo "✅ Ancien cron supprimé"
else
    echo "ℹ️ L'utilisateur laravel n'existe pas"
fi

# Étape 2: Créer le nouveau fichier cron pour root
CRON_FILE="/tmp/laravel_root_cron"

cat > $CRON_FILE << 'EOF'
# Laravel Task Scheduler (exécuté par root avec setuid)
# Runs every minute to check for scheduled tasks

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Laravel schedule runner avec utilisateur www-data pour la compatibilité
* * * * * cd /var/www/html && sudo -u www-data php artisan schedule:run >> /var/log/laravel-cron.log 2>&1

# Rotation des logs toutes les semaines (dimanche à 2h)
0 2 * * 0 cd /var/www/html && echo "$(tail -1000 /var/log/laravel-cron.log)" > /var/log/laravel-cron.log && chown www-data:www-data /var/log/laravel-cron.log

# Correction des permissions des cache toutes les heures
0 * * * * /var/www/html/fix-cache-permissions.sh >> /var/log/laravel-permissions.log 2>&1

EOF

# Étape 3: Installer le nouveau cron pour root
echo "📝 Installation du nouveau cron pour root..."
crontab $CRON_FILE

# Étape 4: Configurer les fichiers de log avec les bonnes permissions
echo "📄 Configuration des logs..."
touch /var/log/laravel-cron.log
chown $WEBUSER:$WEBGROUP /var/log/laravel-cron.log
chmod 664 /var/log/laravel-cron.log

touch /var/log/laravel-permissions.log
chown root:$WEBGROUP /var/log/laravel-permissions.log
chmod 664 /var/log/laravel-permissions.log

# Nettoyer
rm $CRON_FILE

echo "✅ Migration du cron vers root terminée avec succès !"
echo ""
echo "📋 Nouvelle configuration :"
echo "   • Utilisateur cron: root (avec sudo -u www-data pour Laravel)"
echo "   • Fréquence: Toutes les minutes"
echo "   • Log principal: /var/log/laravel-cron.log"
echo "   • Log permissions: /var/log/laravel-permissions.log"
echo "   • Correction automatique des permissions: Toutes les heures"
echo ""
echo "🔍 Vérification :"
echo "   sudo crontab -l"
echo ""
echo "📊 Monitoring :"
echo "   tail -f /var/log/laravel-cron.log"
echo "   tail -f /var/log/laravel-permissions.log"