#!/bin/bash

###############################################################################
# Script de déploiement - Gestion des Formations Manager Itinova
# Version: 1.0.0
# Description: Script automatisé pour déployer l'application en production
###############################################################################

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

# Couleurs pour les messages
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
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"
}

# Fonction pour vérifier les prérequis
check_prerequisites() {
    log_info "Vérification des prérequis..."
    
    # Vérifier Node.js
    if ! command -v node &> /dev/null; then
        log_error "Node.js n'est pas installé"
        exit 1
    fi
    
    NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1)
    if [ "$NODE_VERSION" -lt 18 ]; then
        log_error "Node.js version 18+ est requis (version actuelle: $(node -v))"
        exit 1
    fi
    log_info "Node.js version: $(node -v) ✓"
    
    # Vérifier pnpm
    if ! command -v pnpm &> /dev/null; then
        log_warn "pnpm n'est pas installé. Installation..."
        npm install -g pnpm
    fi
    log_info "pnpm version: $(pnpm -v) ✓"
    
    # Vérifier MySQL
    if ! command -v mysql &> /dev/null; then
        log_warn "MySQL client n'est pas installé"
    else
        log_info "MySQL client: ✓"
    fi
}

# Fonction pour créer le fichier .env si nécessaire
setup_env() {
    log_info "Configuration des variables d'environnement..."
    
    if [ ! -f .env ]; then
        log_warn "Fichier .env non trouvé. Création à partir du template..."
        
        cat > .env << 'EOF'
# Base de données
DATABASE_URL=mysql://user:password@localhost:3306/formation_manager

# JWT Secret (IMPORTANT: Générer une clé aléatoire sécurisée)
JWT_SECRET=changez_cette_cle_secrete_par_une_valeur_aleatoire_tres_longue

# OAuth Manus
OAUTH_SERVER_URL=https://api.manus.im
VITE_OAUTH_PORTAL_URL=https://login.manus.im
VITE_APP_ID=

# Propriétaire
OWNER_OPEN_ID=
OWNER_NAME=

# Application
VITE_APP_TITLE=Gestion des Formations Manager Itinova
VITE_APP_LOGO=/logo.svg

# APIs Manus (optionnel)
BUILT_IN_FORGE_API_URL=https://forge.manus.im
BUILT_IN_FORGE_API_KEY=
VITE_FRONTEND_FORGE_API_KEY=
VITE_FRONTEND_FORGE_API_URL=https://forge.manus.im

# Analytics (optionnel)
VITE_ANALYTICS_ENDPOINT=
VITE_ANALYTICS_WEBSITE_ID=

# Environnement
NODE_ENV=production
EOF
        
        log_warn "Fichier .env créé. IMPORTANT: Modifiez les valeurs avant de continuer!"
        log_warn "Éditez le fichier .env avec vos paramètres de production"
        read -p "Appuyez sur Entrée après avoir configuré le fichier .env..."
    else
        log_info "Fichier .env trouvé ✓"
    fi
}

# Fonction pour installer les dépendances
install_dependencies() {
    log_info "Installation des dépendances..."
    pnpm install --frozen-lockfile
    log_info "Dépendances installées ✓"
}

# Fonction pour sauvegarder la base de données
backup_database() {
    if [ -z "$DATABASE_URL" ]; then
        log_warn "DATABASE_URL non définie, sauvegarde de la base de données ignorée"
        return
    fi
    
    log_info "Sauvegarde de la base de données..."
    
    BACKUP_DIR="./backups"
    mkdir -p $BACKUP_DIR
    
    TIMESTAMP=$(date +%Y%m%d_%H%M%S)
    BACKUP_FILE="$BACKUP_DIR/db_backup_$TIMESTAMP.sql"
    
    # Extraire les informations de connexion de DATABASE_URL
    # Format: mysql://user:password@host:port/database
    DB_USER=$(echo $DATABASE_URL | sed -n 's/.*:\/\/\([^:]*\):.*/\1/p')
    DB_PASS=$(echo $DATABASE_URL | sed -n 's/.*:\/\/[^:]*:\([^@]*\)@.*/\1/p')
    DB_HOST=$(echo $DATABASE_URL | sed -n 's/.*@\([^:]*\):.*/\1/p')
    DB_PORT=$(echo $DATABASE_URL | sed -n 's/.*:\([0-9]*\)\/.*/\1/p')
    DB_NAME=$(echo $DATABASE_URL | sed -n 's/.*\/\([^?]*\).*/\1/p')
    
    if command -v mysqldump &> /dev/null; then
        mysqldump -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_FILE 2>/dev/null || {
            log_warn "Impossible de créer la sauvegarde de la base de données"
            return
        }
        
        gzip $BACKUP_FILE
        log_info "Sauvegarde créée: $BACKUP_FILE.gz ✓"
        
        # Supprimer les sauvegardes de plus de 30 jours
        find $BACKUP_DIR -name "db_backup_*.sql.gz" -mtime +30 -delete
    else
        log_warn "mysqldump non disponible, sauvegarde ignorée"
    fi
}

# Fonction pour appliquer les migrations
run_migrations() {
    log_info "Application des migrations de base de données..."
    pnpm db:push
    log_info "Migrations appliquées ✓"
}

# Fonction pour build l'application
build_app() {
    log_info "Build de l'application..."
    pnpm build
    log_info "Build terminé ✓"
}

# Fonction pour redémarrer le service
restart_service() {
    if command -v systemctl &> /dev/null; then
        SERVICE_NAME="formation-manager"
        
        if systemctl is-active --quiet $SERVICE_NAME; then
            log_info "Redémarrage du service $SERVICE_NAME..."
            sudo systemctl restart $SERVICE_NAME
            
            # Attendre que le service soit actif
            sleep 3
            
            if systemctl is-active --quiet $SERVICE_NAME; then
                log_info "Service redémarré avec succès ✓"
            else
                log_error "Échec du redémarrage du service"
                sudo systemctl status $SERVICE_NAME
                exit 1
            fi
        else
            log_warn "Le service $SERVICE_NAME n'est pas actif"
            log_info "Démarrage du service..."
            sudo systemctl start $SERVICE_NAME
        fi
    else
        log_warn "systemctl non disponible. Redémarrage manuel requis."
    fi
}

# Fonction pour vérifier le déploiement
verify_deployment() {
    log_info "Vérification du déploiement..."
    
    # Vérifier que le serveur répond
    if command -v curl &> /dev/null; then
        sleep 2
        HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3000 || echo "000")
        
        if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "302" ]; then
            log_info "Application accessible ✓"
        else
            log_warn "L'application ne répond pas correctement (HTTP $HTTP_CODE)"
        fi
    fi
}

# Fonction principale
main() {
    echo "╔════════════════════════════════════════════════════════════════╗"
    echo "║   Déploiement - Gestion des Formations Manager Itinova        ║"
    echo "╚════════════════════════════════════════════════════════════════╝"
    echo ""
    
    # Vérifier que nous sommes dans le bon répertoire
    if [ ! -f "package.json" ]; then
        log_error "Ce script doit être exécuté depuis la racine du projet"
        exit 1
    fi
    
    # Étapes de déploiement
    check_prerequisites
    setup_env
    
    # Charger les variables d'environnement
    if [ -f .env ]; then
        export $(cat .env | grep -v '^#' | xargs)
    fi
    
    # Demander confirmation avant de continuer
    echo ""
    log_warn "Le déploiement va:"
    echo "  1. Sauvegarder la base de données"
    echo "  2. Installer les dépendances"
    echo "  3. Appliquer les migrations"
    echo "  4. Builder l'application"
    echo "  5. Redémarrer le service"
    echo ""
    read -p "Continuer? (y/N) " -n 1 -r
    echo ""
    
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        log_info "Déploiement annulé"
        exit 0
    fi
    
    backup_database
    install_dependencies
    run_migrations
    build_app
    restart_service
    verify_deployment
    
    echo ""
    echo "╔════════════════════════════════════════════════════════════════╗"
    echo "║              Déploiement terminé avec succès! ✓                ║"
    echo "╚════════════════════════════════════════════════════════════════╝"
    echo ""
    log_info "L'application est maintenant accessible"
    log_info "Vérifiez les logs avec: sudo journalctl -u formation-manager -f"
}

# Exécuter le script
main "$@"
