#!/bin/bash

# ===========================================
# SCRIPT DE MONITORING PRODUCTION
# Microservice de Recherche Intelligente
# ===========================================

APP_DIR="/home/cundo/Bureau/symfoy_projets/symfo_vue/microservice/search-service"
SERVICE_URL="http://localhost:8003"

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

log_info() {
    echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')] ℹ️  $1${NC}"
}

log_success() {
    echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] ✅ $1${NC}"
}

log_warning() {
    echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] ⚠️  $1${NC}"
}

log_error() {
    echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ❌ $1${NC}"
}

# Vérifier si le service est actif
check_service_status() {
    if pgrep -f "php.*search-service" > /dev/null; then
        log_success "Service actif"
        return 0
    else
        log_error "Service inactif"
        return 1
    fi
}

# Vérifier la santé de l'API
check_api_health() {
    local response
    response=$(curl -s --max-time 10 "$SERVICE_URL/api/search/health" 2>/dev/null)
    
    if echo "$response" | grep -q '"status":"OK"'; then
        log_success "API en bonne santé"
        return 0
    else
        log_error "API en mauvaise santé"
        return 1
    fi
}

# Vérifier les performances
check_performance() {
    local start_time end_time response_time
    start_time=$(date +%s%N)
    
    if curl -s --max-time 10 "$SERVICE_URL/api/search?q=test&limit=1" > /dev/null; then
        end_time=$(date +%s%N)
        response_time=$(( (end_time - start_time) / 1000000 ))
        
        if [ "$response_time" -lt 2000 ]; then
            log_success "Performances OK (${response_time}ms)"
        else
            log_warning "Performances lentes (${response_time}ms)"
        fi
    else
        log_error "Test de performance échoué"
    fi
}

# Vérifier l'utilisation disque
check_disk_usage() {
    local disk_usage
    disk_usage=$(df "$APP_DIR" | awk 'NR==2 {print $5}' | sed 's/%//')
    
    if [ "$disk_usage" -lt 80 ]; then
        log_success "Espace disque OK (${disk_usage}% utilisé)"
    elif [ "$disk_usage" -lt 90 ]; then
        log_warning "Espace disque élevé (${disk_usage}% utilisé)"
    else
        log_error "Espace disque critique (${disk_usage}% utilisé)"
    fi
}

# Vérifier les logs d'erreurs
check_error_logs() {
    local log_file="$APP_DIR/var/log/prod.log"
    local error_count
    
    if [ -f "$log_file" ]; then
        error_count=$(grep -c "ERROR\|CRITICAL" "$log_file" 2>/dev/null || echo 0)
        
        if [ "$error_count" -eq 0 ]; then
            log_success "Aucune erreur récente"
        else
            log_warning "$error_count erreur(s) trouvée(s) dans les logs"
        fi
    else
        log_info "Fichier de log introuvable"
    fi
}

# Vérifier la mémoire
check_memory_usage() {
    local memory_usage
    memory_usage=$(free | awk 'NR==2{printf "%.1f", $3*100/$2 }')
    
    if (( $(echo "$memory_usage < 80" | bc -l) )); then
        log_success "Mémoire OK (${memory_usage}% utilisée)"
    else
        log_warning "Utilisation mémoire élevée (${memory_usage}% utilisée)"
    fi
}

# Redémarrer le service si nécessaire
restart_service() {
    log_info "Redémarrage du service..."
    
    # Arrêter le service
    pkill -f "php.*search-service" || true
    sleep 2
    
    # Redémarrer
    cd "$APP_DIR"
    nohup php -S 0.0.0.0:8003 -t public/ > var/log/server.log 2>&1 &
    
    sleep 3
    
    if check_api_health; then
        log_success "Service redémarré avec succès"
    else
        log_error "Échec du redémarrage"
    fi
}

# Afficher le statut complet
show_status() {
    echo "======================================"
    echo "📊 STATUT DU MICROSERVICE DE RECHERCHE"
    echo "======================================"
    echo ""
    
    check_service_status
    check_api_health
    check_performance
    check_disk_usage
    check_memory_usage
    check_error_logs
    
    echo ""
    echo "🔗 Endpoints:"
    echo "  - Santé: $SERVICE_URL/api/search/health"
    echo "  - Recherche: $SERVICE_URL/api/search?q=test"
    echo ""
}

# Monitoring en continu
continuous_monitoring() {
    log_info "Démarrage du monitoring continu (Ctrl+C pour arrêter)"
    
    while true; do
        clear
        show_status
        
        # Vérifier si le service doit être redémarré
        if ! check_service_status || ! check_api_health; then
            log_warning "Service défaillant détecté, redémarrage..."
            restart_service
        fi
        
        sleep 30
    done
}

# Script principal
case "${1:-status}" in
    "status")
        show_status
        ;;
    "monitor")
        continuous_monitoring
        ;;
    "restart")
        restart_service
        ;;
    "logs")
        tail -f "$APP_DIR/var/log/prod.log"
        ;;
    *)
        echo "Usage: $0 {status|monitor|restart|logs}"
        echo ""
        echo "  status  - Affiche le statut actuel"
        echo "  monitor - Monitoring en continu"
        echo "  restart - Redémarre le service"
        echo "  logs    - Affiche les logs en temps réel"
        ;;
esac