#!/bin/bash

##################################################
# Script de déploiement SERVEUR - CHAPS
# Usage: ./deploy-server.sh
##################################################

set -e  # Arrêter en cas d'erreur

echo "=========================================="
echo "🚀 Déploiement SERVEUR - CHAPS"
echo "=========================================="

# Couleurs
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Fonction pour afficher les messages
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_step() {
    echo -e "${BLUE}[STEP]${NC} $1"
}

# Vérifier qu'on est bien sur le serveur
if [ "$APP_ENV" == "local" ]; then
    log_error "Ce script est prévu pour le serveur. Utilisez deploy-local.sh pour le développement local."
    exit 1
fi

# Vérifier les prérequis
log_info "Vérification des prérequis..."
command -v php >/dev/null 2>&1 || { log_error "PHP n'est pas installé. Aborting."; exit 1; }
command -v composer >/dev/null 2>&1 || { log_error "Composer n'est pas installé. Aborting."; exit 1; }
command -v npm >/dev/null 2>&1 || { log_error "NPM n'est pas installé. Aborting."; exit 1; }

# Étape 0: Mode maintenance
log_step "🔒 Activation du mode maintenance..."
php artisan down --message="Mise à jour en cours, de retour dans quelques instants..." --retry=60 || log_warn "Mode maintenance déjà actif"

# Fonction pour désactiver le mode maintenance en cas d'erreur
cleanup() {
    log_warn "⚠️  Erreur détectée, désactivation du mode maintenance..."
    php artisan up
}
trap cleanup ERR

# Étape 1: Sauvegarde de la base de données
log_step "💾 Sauvegarde de la base de données..."
BACKUP_DIR="backups/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"

# Lire les variables depuis .env
DB_DATABASE=$(grep DB_DATABASE .env | cut -d '=' -f2)
DB_USERNAME=$(grep DB_USERNAME .env | cut -d '=' -f2)
DB_PASSWORD=$(grep DB_PASSWORD .env | cut -d '=' -f2)

if [ -n "$DB_DATABASE" ]; then
    mysqldump -u "$DB_USERNAME" -p"$DB_PASSWORD" "$DB_DATABASE" > "$BACKUP_DIR/database_backup.sql" 2>/dev/null || log_warn "Sauvegarde base de données échouée"
    log_info "✅ Backup créé: $BACKUP_DIR/database_backup.sql"
fi

# Étape 2: Git Pull
log_step "📥 Récupération des dernières modifications..."
git fetch origin
git reset --hard origin/master || { log_error "Git pull a échoué"; cleanup; exit 1; }

# Étape 3: Mise à jour des dépendances Composer
log_step "📦 Mise à jour des dépendances PHP (Composer)..."
composer install --no-interaction --prefer-dist --optimize-autoloader --no-dev

# Étape 4: Mise à jour des dépendances NPM
log_step "📦 Mise à jour des dépendances NPM..."
npm ci --production

# Étape 5: Compilation des assets (Tailwind CSS)
log_step "🎨 Compilation de Tailwind CSS..."
npm run build:css

# Étape 6: Cache Laravel
log_step "🗑️  Nettoyage des caches Laravel..."
php artisan config:clear
php artisan cache:clear
php artisan route:clear
php artisan view:clear

log_step "📝 Mise en cache de la configuration..."
php artisan config:cache
php artisan route:cache
php artisan view:cache

# Étape 7: Migrations de base de données
log_step "🗄️  Exécution des migrations..."
php artisan migrate --force

# Étape 8: Permissions
log_step "🔐 Ajustement des permissions..."
chmod -R 775 storage bootstrap/cache
chmod -R 775 public/css
chown -R www-data:www-data storage bootstrap/cache public/css 2>/dev/null || log_warn "Impossible de changer le propriétaire (permissions insuffisantes)"

# Étape 9: Optimisation
log_step "⚡ Optimisation de l'application..."
php artisan optimize

# Étape 10: Redémarrage des services
log_step "🔄 Redémarrage des services..."
if command -v systemctl >/dev/null 2>&1; then
    sudo systemctl reload php-fpm 2>/dev/null || log_warn "Impossible de redémarrer PHP-FPM"
    sudo systemctl reload nginx 2>/dev/null || sudo systemctl reload apache2 2>/dev/null || log_warn "Impossible de redémarrer le serveur web"
else
    log_warn "systemctl non disponible, redémarrage manuel requis"
fi

# Étape 11: Désactivation du mode maintenance
log_step "✅ Désactivation du mode maintenance..."
php artisan up

# Étape 12: Test de santé
log_step "🏥 Test de santé de l'application..."
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "${APP_URL:-http://localhost}" || echo "000")
if [ "$HTTP_CODE" == "200" ]; then
    log_info "✅ Application accessible (HTTP $HTTP_CODE)"
else
    log_warn "⚠️  Application retourne HTTP $HTTP_CODE"
fi

# Nettoyage des anciens backups (garder les 10 derniers)
log_step "🧹 Nettoyage des anciens backups..."
cd backups && ls -t | tail -n +11 | xargs rm -rf 2>/dev/null || true
cd ..

echo ""
log_info "=========================================="
log_info "✅ Déploiement SERVEUR terminé avec succès!"
log_info "=========================================="
echo ""
log_info "📊 Informations utiles:"
echo "   - Backup: $BACKUP_DIR"
echo "   - URL: ${APP_URL:-Non définie}"
echo "   - Voir les logs: tail -f storage/logs/laravel.log"
echo "   - Rollback si nécessaire: git reset --hard <commit_précédent>"
echo ""
