#!/bin/bash

# 🚀 VEZA DEVELOPMENT ENVIRONMENT SETUP
# Script de configuration complète de l'environnement de développement

set -e

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

# 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}"
}

# Fonction pour vérifier si une commande existe
command_exists() {
    command -v "$1" >/dev/null 2>&1
}

# Fonction pour installer une dépendance si elle n'existe pas
install_if_missing() {
    local cmd=$1
    local install_cmd=$2
    
    if ! command_exists "$cmd"; then
        log_warning "$cmd n'est pas installé. Installation..."
        eval "$install_cmd"
        log_success "$cmd installé avec succès"
    else
        log_success "$cmd est déjà installé"
    fi
}

# Header
echo -e "${BLUE}"
echo "╔══════════════════════════════════════════════════════════════╗"
echo "║                    VEZA DEVELOPMENT SETUP                   ║"
echo "║              Configuration de l'environnement               ║"
echo "╚══════════════════════════════════════════════════════════════╝"
echo -e "${NC}"

# 1. Vérification des prérequis système
log_info "Vérification des prérequis système..."

# Vérifier le système d'exploitation
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
    OS="linux"
    log_success "Système Linux détecté"
elif [[ "$OSTYPE" == "darwin"* ]]; then
    OS="macos"
    log_success "Système macOS détecté"
else
    log_error "Système d'exploitation non supporté: $OSTYPE"
    exit 1
fi

# 2. Installation des dépendances de base
log_info "Installation des dépendances de base..."

# Git
install_if_missing "git" "sudo apt-get update && sudo apt-get install -y git"

# Curl
install_if_missing "curl" "sudo apt-get install -y curl"

# Wget
install_if_missing "wget" "sudo apt-get install -y wget"

# 3. Installation de Docker
log_info "Installation de Docker..."
if ! command_exists "docker"; then
    log_warning "Docker n'est pas installé. Installation..."
    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
    sudo usermod -aG docker $USER
    rm get-docker.sh
    log_success "Docker installé avec succès"
else
    log_success "Docker est déjà installé"
fi

# 4. Installation de Docker Compose
log_info "Installation de Docker Compose..."
if ! command_exists "docker-compose"; then
    log_warning "Docker Compose n'est pas installé. Installation..."
    sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    log_success "Docker Compose installé avec succès"
else
    log_success "Docker Compose est déjà installé"
fi

# 5. Installation de Go
log_info "Installation de Go..."
if ! command_exists "go"; then
    log_warning "Go n'est pas installé. Installation..."
    GO_VERSION="1.23.0"
    wget "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz"
    sudo rm -rf /usr/local/go
    sudo tar -C /usr/local -xzf "go${GO_VERSION}.linux-amd64.tar.gz"
    rm "go${GO_VERSION}.linux-amd64.tar.gz"
    
    # Ajouter Go au PATH
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
    export PATH=$PATH:/usr/local/go/bin
    log_success "Go installé avec succès"
else
    log_success "Go est déjà installé"
fi

# 6. Installation de Rust
log_info "Installation de Rust..."
if ! command_exists "cargo"; then
    log_warning "Rust n'est pas installé. Installation..."
    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
    source ~/.cargo/env
    log_success "Rust installé avec succès"
else
    log_success "Rust est déjà installé"
fi

# 7. Installation de Node.js
log_info "Installation de Node.js..."
if ! command_exists "node"; then
    log_warning "Node.js n'est pas installé. Installation..."
    curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
    sudo apt-get install -y nodejs
    log_success "Node.js installé avec succès"
else
    log_success "Node.js est déjà installé"
fi

# 8. Installation de PostgreSQL
log_info "Installation de PostgreSQL..."
if ! command_exists "psql"; then
    log_warning "PostgreSQL n'est pas installé. Installation..."
    sudo apt-get update
    sudo apt-get install -y postgresql postgresql-contrib
    sudo systemctl start postgresql
    sudo systemctl enable postgresql
    log_success "PostgreSQL installé avec succès"
else
    log_success "PostgreSQL est déjà installé"
fi

# 9. Installation de Redis
log_info "Installation de Redis..."
if ! command_exists "redis-server"; then
    log_warning "Redis n'est pas installé. Installation..."
    sudo dnf install -y redis-server
    sudo systemctl start redis-server
    sudo systemctl enable redis-server
    log_success "Redis installé avec succès"
else
    log_success "Redis est déjà installé"
fi

# 10. Installation des outils de développement
log_info "Installation des outils de développement..."

# kubectl
install_if_missing "kubectl" "curl -LO 'https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl' && sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl"

# helm
install_if_missing "helm" "curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash"

# terraform
install_if_missing "terraform" "wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg && echo 'deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main' | sudo tee /etc/apt/sources.list.d/hashicorp.list && sudo apt update && sudo apt install terraform"

# 11. Configuration des services
log_info "Configuration des services..."

# Configuration PostgreSQL
sudo -u postgres psql -c "CREATE DATABASE veza_dev;" 2>/dev/null || log_warning "Base de données veza_dev existe déjà"
sudo -u postgres psql -c "CREATE USER veza_user WITH PASSWORD 'veza_password';" 2>/dev/null || log_warning "Utilisateur veza_user existe déjà"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE veza_dev TO veza_user;" 2>/dev/null || log_warning "Privilèges déjà accordés"

# Configuration Redis
sudo systemctl restart redis-server

# 12. Création des fichiers de configuration
log_info "Création des fichiers de configuration..."

# Fichier .env pour le développement
cat > .env.dev << 'ENVEOF'
# Configuration de développement Veza
NODE_ENV=development
DEBUG=true

# Base de données
DB_HOST=localhost
DB_PORT=5432
DB_NAME=veza_dev
DB_USER=veza_user
DB_PASSWORD=veza_password
DB_SSL_MODE=disable

# Redis
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=

# Services
BACKEND_PORT=8080
CHAT_PORT=3001
STREAM_PORT=8000
FRONTEND_PORT=3000

# JWT
JWT_SECRET=dev_jwt_secret_key_change_in_production
JWT_EXPIRES_IN=24h

# OAuth (pour le développement)
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
GITHUB_CLIENT_ID=your_github_client_id
GITHUB_CLIENT_SECRET=your_github_client_secret

# Monitoring
PROMETHEUS_PORT=9090
GRAFANA_PORT=3001
JAEGER_PORT=16686
ENVEOF

log_success "Fichier .env.dev créé"

# 13. Installation des dépendances des projets
log_info "Installation des dépendances des projets..."

# Backend API
if [ -d "veza-backend-api" ]; then
    log_info "Installation des dépendances Backend API..."
    cd veza-backend-api
    go mod download
    go mod tidy
    cd ..
    log_success "Dépendances Backend API installées"
fi

# Chat Server
if [ -d "veza-chat-server" ]; then
    log_info "Installation des dépendances Chat Server..."
    cd veza-chat-server
    cargo build
    cd ..
    log_success "Dépendances Chat Server installées"
fi

# Stream Server
if [ -d "veza-stream-server" ]; then
    log_info "Installation des dépendances Stream Server..."
    cd veza-stream-server
    cargo build
    cd ..
    log_success "Dépendances Stream Server installées"
fi

# Frontend
if [ -d "veza-frontend" ]; then
    log_info "Installation des dépendances Frontend..."
    cd veza-frontend
    npm install
    cd ..
    log_success "Dépendances Frontend installées"
fi

# Mobile
if [ -d "veza-mobile" ]; then
    log_info "Installation des dépendances Mobile..."
    cd veza-mobile
    npm install
    cd ..
    log_success "Dépendances Mobile installées"
fi

# 14. Création des scripts utiles
log_info "Création des scripts utiles..."

# Script de démarrage de tous les services
cat > start-all-services.sh << 'SCRIPTEOF'
#!/bin/bash
# Script de démarrage de tous les services Veza

echo "🚀 Démarrage de tous les services Veza..."

# Démarrer PostgreSQL
sudo systemctl start postgresql
echo "✅ PostgreSQL démarré"

# Démarrer Redis
sudo systemctl start redis-server
echo "✅ Redis démarré"

# Démarrer Backend API
cd veza-backend-api
go run cmd/modern-server/main.go &
BACKEND_PID=$!
echo "✅ Backend API démarré (PID: $BACKEND_PID)"

# Démarrer Chat Server
cd ../veza-chat-server
cargo run &
CHAT_PID=$!
echo "✅ Chat Server démarré (PID: $CHAT_PID)"

# Démarrer Stream Server
cd ../veza-stream-server
cargo run &
STREAM_PID=$!
echo "✅ Stream Server démarré (PID: $STREAM_PID)"

# Démarrer Frontend
cd ../veza-frontend
npm run dev &
FRONTEND_PID=$!
echo "✅ Frontend démarré (PID: $FRONTEND_PID)"

echo "🎉 Tous les services sont démarrés!"
echo "Backend API: http://localhost:8080"
echo "Chat Server: http://localhost:3001"
echo "Stream Server: http://localhost:8000"
echo "Frontend: http://localhost:3000"

# Sauvegarder les PIDs
echo $BACKEND_PID > logs/backend.pid
echo $CHAT_PID > logs/chat-server.pid
echo $STREAM_PID > logs/stream-server.pid
echo $FRONTEND_PID > logs/frontend.pid
SCRIPTEOF

chmod +x start-all-services.sh
log_success "Script start-all-services.sh créé"

# Script d'arrêt de tous les services
cat > stop-all-services.sh << 'SCRIPTEOF'
#!/bin/bash
# Script d'arrêt de tous les services Veza

echo "🛑 Arrêt de tous les services Veza..."

# Arrêter les services via leurs PIDs
if [ -f "logs/backend.pid" ]; then
    kill $(cat logs/backend.pid) 2>/dev/null || true
    echo "✅ Backend API arrêté"
fi

if [ -f "logs/chat-server.pid" ]; then
    kill $(cat logs/chat-server.pid) 2>/dev/null || true
    echo "✅ Chat Server arrêté"
fi

if [ -f "logs/stream-server.pid" ]; then
    kill $(cat logs/stream-server.pid) 2>/dev/null || true
    echo "✅ Stream Server arrêté"
fi

if [ -f "logs/frontend.pid" ]; then
    kill $(cat logs/frontend.pid) 2>/dev/null || true
    echo "✅ Frontend arrêté"
fi

echo "🎉 Tous les services sont arrêtés!"
SCRIPTEOF

chmod +x stop-all-services.sh
log_success "Script stop-all-services.sh créé"

# 15. Création du répertoire logs
mkdir -p logs
log_success "Répertoire logs créé"

# 16. Finalisation
log_success "Configuration de l'environnement terminée!"

echo -e "${GREEN}"
echo "╔══════════════════════════════════════════════════════════════╗"
echo "║                    SETUP TERMINÉ AVEC SUCCÈS               ║"
echo "╚══════════════════════════════════════════════════════════════╝"
echo -e "${NC}"

echo -e "${BLUE}📋 Prochaines étapes:${NC}"
echo "1. Redémarrez votre terminal ou exécutez: source ~/.bashrc"
echo "2. Exécutez: ./start-all-services.sh pour démarrer tous les services"
echo "3. Visitez http://localhost:3000 pour accéder au frontend"
echo "4. Consultez DEVELOPMENT_STRATEGY.md pour la stratégie de développement"

echo -e "${YELLOW}⚠️  Note: Vous devrez peut-être redémarrer votre session pour que tous les PATH soient mis à jour.${NC}"
