#!/bin/bash

# ===========================================
# SCRIPT DE DÉPLOIEMENT PRODUCTION 
# Microservice de Recherche Intelligente
# ===========================================

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

echo "🚀 Début du déploiement en production..."

# 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

# Variables
APP_DIR="/home/cundo/Bureau/symfoy_projets/symfo_vue/microservice/search-service"
BACKUP_DIR="/tmp/search-service-backup-$(date +%Y%m%d-%H%M%S)"

# Fonction pour afficher les messages
log_info() {
    echo -e "${BLUE}ℹ️  $1${NC}"
}

log_success() {
    echo -e "${GREEN}✅ $1${NC}"
}

log_warning() {
    echo -e "${YELLOW}⚠️  $1${NC}"
}

log_error() {
    echo -e "${RED}❌ $1${NC}"
}

# Vérification des prérequis
check_requirements() {
    log_info "Vérification des prérequis..."
    
    # Vérifier PHP
    if ! command -v php &> /dev/null; then
        log_error "PHP n'est pas installé"
        exit 1
    fi
    
    # Vérifier Composer
    if ! command -v composer &> /dev/null; then
        log_error "Composer n'est pas installé"
        exit 1
    fi
    
    # Vérifier la version PHP
    php_version=$(php -r "echo PHP_VERSION;" | cut -d. -f1,2)
    if [[ $(echo "$php_version < 8.1" | bc -l) ]]; then
        log_error "PHP 8.1+ requis, version actuelle: $php_version"
        exit 1
    fi
    
    log_success "Prérequis validés"
}

# Sauvegarde de sécurité
create_backup() {
    log_info "Création de la sauvegarde..."
    
    if [ -d "$APP_DIR" ]; then
        mkdir -p "$BACKUP_DIR"
        cp -r "$APP_DIR/." "$BACKUP_DIR/"
        log_success "Sauvegarde créée: $BACKUP_DIR"
    fi
}

# Installation des dépendances optimisées pour la production
install_dependencies() {
    log_info "Installation des dépendances production..."
    
    cd "$APP_DIR"
    
    # Installation optimisée pour la production
    composer install --no-dev --optimize-autoloader --no-scripts --prefer-dist
    
    # Vider le cache Composer
    composer clear-cache
    
    log_success "Dépendances installées"
}

# Configuration de l'environnement
configure_environment() {
    log_info "Configuration de l'environnement production..."
    
    cd "$APP_DIR"
    
    # Vérifier que .env est configuré pour la production
    if ! grep -q "APP_ENV=prod" .env; then
        log_error "Le fichier .env n'est pas configuré pour la production"
        exit 1
    fi
    
    # Vérifier la clé OpenAI
    if grep -q "your_openai_api_key_here" .env; then
        log_warning "Clé OpenAI par défaut détectée - pensez à la changer!"
    fi
    
    log_success "Configuration validée"
}

# Optimisation du cache
optimize_cache() {
    log_info "Optimisation du cache Symfony..."
    
    cd "$APP_DIR"
    
    # Vider tous les caches
    php bin/console cache:clear --env=prod --no-debug
    
    # Préchauffage du cache
    php bin/console cache:warmup --env=prod --no-debug
    
    # Optimisation de l'autoloader
    composer dump-autoload --optimize --classmap-authoritative
    
    log_success "Cache optimisé"
}

# Vérification des permissions
fix_permissions() {
    log_info "Configuration des permissions..."
    
    cd "$APP_DIR"
    
    # Permissions sur les dossiers var/
    chmod -R 755 var/
    
    # Permissions sur les logs
    if [ -d "var/log" ]; then
        chmod -R 666 var/log/
    fi
    
    # Permissions sur le cache
    if [ -d "var/cache" ]; then
        chmod -R 755 var/cache/
    fi
    
    log_success "Permissions configurées"
}

# Validation de la configuration
validate_configuration() {
    log_info "Validation de la configuration..."
    
    cd "$APP_DIR"
    
    # Test de la syntaxe PHP
    find src/ -name "*.php" -exec php -l {} \; | grep -v "No syntax errors"
    
    # Test de la configuration Symfony
    php bin/console config:dump framework --env=prod > /dev/null
    
    # Test de connectivité avec l'API principale
    if ! curl -s --max-time 5 "$MAIN_API_BASE_URL/health" > /dev/null; then
        log_warning "Impossible de contacter l'API principale: $MAIN_API_BASE_URL"
    fi
    
    log_success "Configuration validée"
}

# Nettoyage des fichiers de développement
cleanup_dev_files() {
    log_info "Nettoyage des fichiers de développement..."
    
    cd "$APP_DIR"
    
    # Supprimer les fichiers de développement
    rm -f phpunit.xml
    rm -rf tests/
    rm -f .phpunit.result.cache
    
    # Nettoyage des logs anciens
    find var/log/ -name "*.log" -mtime +7 -delete 2>/dev/null || true
    
    log_success "Nettoyage effectué"
}

# Démarrage du service
start_service() {
    log_info "Démarrage du service de production..."
    
    cd "$APP_DIR"
    
    # Arrêter les anciens processus
    pkill -f "php.*search-service" || true
    sleep 2
    
    # Démarrer le nouveau service en arrière-plan
    nohup php -S 0.0.0.0:8003 -t public/ > var/log/server.log 2>&1 &
    
    # Attendre le démarrage
    sleep 3
    
    # Test de santé
    if curl -s http://localhost:8003/api/search/health | grep -q '"status":"OK"'; then
        log_success "Service démarré avec succès"
    else
        log_error "Échec du démarrage du service"
        exit 1
    fi
}

# Test post-déploiement
run_health_checks() {
    log_info "Tests de santé post-déploiement..."
    
    # Test endpoint de santé
    if ! curl -s http://localhost:8003/api/search/health > /dev/null; then
        log_error "Endpoint de santé inaccessible"
        exit 1
    fi
    
    # Test recherche simple
    if ! curl -s "http://localhost:8003/api/search?q=test&limit=1" | grep -q '"success":true'; then
        log_error "Recherche simple ne fonctionne pas"
        exit 1
    fi
    
    log_success "Tests de santé validés"
}

# Affichage des informations de déploiement
show_deployment_info() {
    echo ""
    echo "======================================"
    log_success "DÉPLOIEMENT TERMINÉ AVEC SUCCÈS"
    echo "======================================"
    echo ""
    echo "🌐 URL du service: http://localhost:8003"
    echo "📊 Santé: http://localhost:8003/api/search/health"
    echo "📁 Logs: $APP_DIR/var/log/"
    echo "💾 Sauvegarde: $BACKUP_DIR"
    echo ""
    echo "🔧 Commandes utiles:"
    echo "  - Logs en temps réel: tail -f $APP_DIR/var/log/prod.log"
    echo "  - Redémarrer: pkill -f 'php.*search-service' && cd $APP_DIR && php -S 0.0.0.0:8003 -t public/ &"
    echo "  - Vider cache: cd $APP_DIR && php bin/console cache:clear --env=prod"
    echo ""
}

# Fonction de rollback en cas d'erreur
rollback() {
    log_error "Erreur détectée, rollback en cours..."
    
    if [ -d "$BACKUP_DIR" ]; then
        rm -rf "$APP_DIR"
        mv "$BACKUP_DIR" "$APP_DIR"
        log_success "Rollback effectué"
    fi
    
    exit 1
}

# Piège pour les erreurs
trap rollback ERR

# EXÉCUTION PRINCIPALE
main() {
    echo "🚀 Déploiement Production - Microservice de Recherche Intelligente"
    echo "================================================================="
    
    check_requirements
    create_backup
    configure_environment
    install_dependencies
    optimize_cache
    fix_permissions
    cleanup_dev_files
    validate_configuration
    start_service
    run_health_checks
    show_deployment_info
    
    echo ""
    log_success "🎉 Déploiement terminé avec succès!"
}

# Exécuter le script principal
main "$@"