#!/bin/bash

# Script de démarrage des agents IA
# Démarre tous les agents configurés pour Veza Platform

set -e

# Configuration
AGENTS_DIR=".cursor/agents"
CONFIG_FILE=".cursor/agents/config.yaml"
LOG_DIR="logs"
PID_DIR=".cursor/agents/pids"

# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# Fonction d'aide
show_help() {
    echo -e "${CYAN}🤖 Script de démarrage des agents IA - Veza Platform${NC}"
    echo ""
    echo "Usage: $0 [OPTIONS] [AGENT]"
    echo ""
    echo "Options:"
    echo "  -h, --help          Afficher cette aide"
    echo "  -a, --all           Démarrer tous les agents"
    echo "  -s, --status        Afficher le statut des agents"
    echo "  -k, --kill          Arrêter tous les agents"
    echo "  -r, --restart       Redémarrer tous les agents"
    echo "  -l, --logs          Afficher les logs des agents"
    echo "  -c, --config        Afficher la configuration"
    echo ""
    echo "Agents disponibles:"
    echo "  planner             Agent planificateur"
    echo "  researcher          Agent chercheur"
    echo "  implementer         Agent implémenteur"
    echo "  qa                  Agent QA"
    echo "  docs                Agent documentation"
    echo "  maintainer          Agent maintenance"
    echo ""
    echo "Exemples:"
    echo "  $0 --all                    # Démarrer tous les agents"
    echo "  $0 planner                  # Démarrer seulement l'agent planificateur"
    echo "  $0 --status                 # Afficher le statut"
    echo "  $0 --kill                   # Arrêter tous les agents"
}

# Fonction pour créer les répertoires nécessaires
setup_directories() {
    echo -e "${BLUE}[INFO]${NC} Configuration des répertoires..."
    mkdir -p "$LOG_DIR"
    mkdir -p "$PID_DIR"
    mkdir -p "$AGENTS_DIR"/{planner,researcher,implementer,qa,docs,maintainer}
    echo -e "${GREEN}[SUCCESS]${NC} Répertoires configurés"
}

# Fonction pour vérifier la configuration
check_config() {
    if [ ! -f "$CONFIG_FILE" ]; then
        echo -e "${RED}[ERROR]${NC} Fichier de configuration non trouvé: $CONFIG_FILE"
        exit 1
    fi
    
    if ! command -v yq &> /dev/null; then
        echo -e "${YELLOW}[WARNING]${NC} yq non installé, utilisation de grep pour la configuration"
        return 1
    fi
    
    return 0
}

# Fonction pour démarrer un agent
start_agent() {
    local agent_name="$1"
    local agent_dir="$AGENTS_DIR/$agent_name"
    local pid_file="$PID_DIR/$agent_name.pid"
    local log_file="$LOG_DIR/$agent_name.log"
    
    # Vérifier si l'agent est déjà en cours d'exécution
    if [ -f "$pid_file" ] && kill -0 "$(cat "$pid_file")" 2>/dev/null; then
        echo -e "${YELLOW}[WARNING]${NC} Agent $agent_name est déjà en cours d'exécution (PID: $(cat "$pid_file"))"
        return 0
    fi
    
    echo -e "${BLUE}[INFO]${NC} Démarrage de l'agent $agent_name..."
    
    # Créer le script de l'agent s'il n'existe pas
    local agent_script="$agent_dir/run.sh"
    if [ ! -f "$agent_script" ]; then
        create_agent_script "$agent_name" "$agent_script"
    fi
    
    # Démarrer l'agent en arrière-plan
    nohup bash "$agent_script" > "$log_file" 2>&1 &
    local pid=$!
    echo $pid > "$pid_file"
    
    # Attendre un peu pour vérifier que l'agent démarre correctement
    sleep 2
    if kill -0 $pid 2>/dev/null; then
        echo -e "${GREEN}[SUCCESS]${NC} Agent $agent_name démarré (PID: $pid)"
        echo "Agent $agent_name démarré" > "$agent_dir/status.txt"
    else
        echo -e "${RED}[ERROR]${NC} Échec du démarrage de l'agent $agent_name"
        rm -f "$pid_file"
        return 1
    fi
}

# Fonction pour créer le script d'un agent
create_agent_script() {
    local agent_name="$1"
    local script_path="$2"
    
    cat > "$script_path" << EOF
#!/bin/bash
# Script d'exécution pour l'agent $agent_name

set -e

# Configuration
AGENT_NAME="$agent_name"
AGENT_DIR=".cursor/agents/$agent_name"
LOG_FILE="logs/$agent_name.log"
PID_FILE=".cursor/agents/pids/$agent_name.pid"

# Fonction de nettoyage
cleanup() {
    echo "Arrêt de l'agent \$AGENT_NAME..."
    rm -f "\$PID_FILE"
    exit 0
}

# Capturer les signaux d'arrêt
trap cleanup SIGTERM SIGINT

# Boucle principale de l'agent
while true; do
    case "\$AGENT_NAME" in
        "planner")
            echo "\$(date): Exécution de l'agent Planificateur..." >> "\$LOG_FILE"
            # Logique de planification
            sleep 60
            ;;
        "researcher")
            echo "\$(date): Exécution de l'agent Chercheur..." >> "\$LOG_FILE"
            # Logique de recherche
            sleep 300
            ;;
        "implementer")
            echo "\$(date): Exécution de l'agent Implémenteur..." >> "\$LOG_FILE"
            # Logique d'implémentation
            sleep 30
            ;;
        "qa")
            echo "\$(date): Exécution de l'agent QA..." >> "\$LOG_FILE"
            # Logique de QA
            sleep 120
            ;;
        "docs")
            echo "\$(date): Exécution de l'agent Documentation..." >> "\$LOG_FILE"
            # Logique de documentation
            sleep 180
            ;;
        "maintainer")
            echo "\$(date): Exécution de l'agent Maintenance..." >> "\$LOG_FILE"
            # Logique de maintenance
            sleep 600
            ;;
        *)
            echo "\$(date): Agent inconnu: \$AGENT_NAME" >> "\$LOG_FILE"
            sleep 60
            ;;
    esac
done
EOF
    
    chmod +x "$script_path"
}

# Fonction pour arrêter un agent
stop_agent() {
    local agent_name="$1"
    local pid_file="$PID_DIR/$agent_name.pid"
    
    if [ -f "$pid_file" ]; then
        local pid=$(cat "$pid_file")
        if kill -0 "$pid" 2>/dev/null; then
            echo -e "${BLUE}[INFO]${NC} Arrêt de l'agent $agent_name (PID: $pid)..."
            kill "$pid"
            rm -f "$pid_file"
            echo "Agent $agent_name arrêté" > "$AGENTS_DIR/$agent_name/status.txt"
            echo -e "${GREEN}[SUCCESS]${NC} Agent $agent_name arrêté"
        else
            echo -e "${YELLOW}[WARNING]${NC} Agent $agent_name n'était pas en cours d'exécution"
            rm -f "$pid_file"
        fi
    else
        echo -e "${YELLOW}[WARNING]${NC} Fichier PID non trouvé pour l'agent $agent_name"
    fi
}

# Fonction pour afficher le statut des agents
show_status() {
    echo -e "${CYAN}🤖 Statut des Agents IA - Veza Platform${NC}"
    echo ""
    echo "| Agent | PID | Statut | Dernière activité |"
    echo "|-------|-----|--------|-------------------|"
    
    for agent in planner researcher implementer qa docs maintainer; do
        local pid_file="$PID_DIR/$agent.pid"
        local status_file="$AGENTS_DIR/$agent/status.txt"
        
        if [ -f "$pid_file" ]; then
            local pid=$(cat "$pid_file")
            if kill -0 "$pid" 2>/dev/null; then
                local status="🟢 Actif"
                local last_activity=$(stat -c %y "$status_file" 2>/dev/null | cut -d' ' -f2 | cut -d'.' -f1 || echo "N/A")
            else
                local status="🔴 Arrêté"
                local last_activity="N/A"
            fi
        else
            local status="⚪ Inactif"
            local last_activity="N/A"
        fi
        
        printf "| %-10s | %-3s | %-10s | %-17s |\n" "$agent" "${pid:-N/A}" "$status" "$last_activity"
    done
    echo ""
}

# Fonction pour afficher les logs
show_logs() {
    local agent_name="$1"
    
    if [ -n "$agent_name" ]; then
        local log_file="$LOG_DIR/$agent_name.log"
        if [ -f "$log_file" ]; then
            echo -e "${CYAN}📋 Logs de l'agent $agent_name${NC}"
            echo ""
            tail -f "$log_file"
        else
            echo -e "${RED}[ERROR]${NC} Fichier de log non trouvé: $log_file"
        fi
    else
        echo -e "${CYAN}📋 Logs de tous les agents${NC}"
        echo ""
        for agent in planner researcher implementer qa docs maintainer; do
            local log_file="$LOG_DIR/$agent.log"
            if [ -f "$log_file" ]; then
                echo -e "${YELLOW}=== $agent ===${NC}"
                tail -5 "$log_file"
                echo ""
            fi
        done
    fi
}

# Fonction pour afficher la configuration
show_config() {
    if [ -f "$CONFIG_FILE" ]; then
        echo -e "${CYAN}⚙️ Configuration des Agents IA${NC}"
        echo ""
        if command -v yq &> /dev/null; then
            yq eval '.agents' "$CONFIG_FILE"
        else
            cat "$CONFIG_FILE"
        fi
    else
        echo -e "${RED}[ERROR]${NC} Fichier de configuration non trouvé: $CONFIG_FILE"
    fi
}

# Fonction principale
main() {
    case "${1:-}" in
        -h|--help)
            show_help
            ;;
        -a|--all)
            setup_directories
            echo -e "${CYAN}🚀 Démarrage de tous les agents...${NC}"
            for agent in planner researcher implementer qa docs maintainer; do
                start_agent "$agent"
            done
            echo -e "${GREEN}✅ Tous les agents démarrés${NC}"
            ;;
        -s|--status)
            show_status
            ;;
        -k|--kill)
            echo -e "${CYAN}🛑 Arrêt de tous les agents...${NC}"
            for agent in planner researcher implementer qa docs maintainer; do
                stop_agent "$agent"
            done
            echo -e "${GREEN}✅ Tous les agents arrêtés${NC}"
            ;;
        -r|--restart)
            echo -e "${CYAN}🔄 Redémarrage de tous les agents...${NC}"
            for agent in planner researcher implementer qa docs maintainer; do
                stop_agent "$agent"
            done
            sleep 2
            for agent in planner researcher implementer qa docs maintainer; do
                start_agent "$agent"
            done
            echo -e "${GREEN}✅ Tous les agents redémarrés${NC}"
            ;;
        -l|--logs)
            show_logs "$2"
            ;;
        -c|--config)
            show_config
            ;;
        planner|researcher|implementer|qa|docs|maintainer)
            setup_directories
            start_agent "$1"
            ;;
        "")
            show_help
            ;;
        *)
            echo -e "${RED}[ERROR]${NC} Option ou agent inconnu: $1"
            show_help
            exit 1
            ;;
    esac
}

# Exécuter la fonction principale
main "$@"
