#!/bin/bash

# Script de déploiement automatique pour Inventory V2
# Usage: ./deploy.sh [backend|frontend|all]

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

# Configuration
PROJECT_DIR="/home/matt/inventory_v2"
BACKEND_DIR="$PROJECT_DIR/inventory_backend"
FRONTEND_DIR="$PROJECT_DIR/inventory_frontend"
LOG_FILE="/tmp/deploy.log"

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

# Fonction de logging
log() {
    echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE"
}

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

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

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

# Fonction pour déployer le backend
deploy_backend() {
    log "Déploiement du backend..."
    
    # Sauvegarde automatique de la base de données avant modification
    log "Sauvegarde automatique de la base de données..."
    if command -v pg_dump &> /dev/null; then
        BACKUP_DIR="/home/matt/backups"
        DATE=$(date +"%Y%m%d_%H%M%S")
        BACKUP_FILE="auto_backup_$DATE.sql"
        
        # Créer le répertoire de sauvegarde
        mkdir -p "$BACKUP_DIR"
        
        # Sauvegarde de la base de données
        if pg_dump -h localhost -U inventory_user -d inventory_db > "$BACKUP_DIR/$BACKUP_FILE" 2>/dev/null; then
            # Compresser la sauvegarde
            gzip "$BACKUP_DIR/$BACKUP_FILE"
            log_success "Sauvegarde automatique créée: $BACKUP_DIR/$BACKUP_FILE.gz"
            
            # Garder seulement les 10 dernières sauvegardes automatiques
            cd "$BACKUP_DIR"
            ls -t auto_backup_*.sql.gz | tail -n +11 | xargs -r rm
        else
            log_warning "Impossible de créer la sauvegarde automatique (base de données non accessible)"
        fi
    else
        log_warning "pg_dump non trouvé, sauvegarde automatique impossible"
    fi
    
    cd "$BACKEND_DIR"
    
    # Sauvegarder les modifications locales si nécessaire
    if ! git diff-index --quiet HEAD --; then
        log_warning "Modifications locales détectées, sauvegarde..."
        git stash push -m "Auto-sauvegarde avant déploiement $(date)"
    fi
    
    # Pull les dernières modifications
    log "Récupération des dernières modifications..."
    git pull origin master
    
    # Installer les dépendances si nécessaire
    if [ ! -d "node_modules" ] || [ "package.json" -nt "node_modules" ]; then
        log "Installation des dépendances..."
        npm install
    fi
    
    # Build du projet
    log "Compilation du projet..."
    npm run build
    
    # Appliquer les migrations Prisma si nécessaire
    log "Vérification et application des migrations Prisma..."
    npx prisma migrate deploy
    
    # Générer le client Prisma
    log "Génération du client Prisma..."
    npx prisma generate
    
    # Redémarrer le service backend
    log "Redémarrage du service backend..."
    if systemctl is-active --quiet inventory-backend; then
        sudo systemctl restart inventory-backend
        log_success "Service backend redémarré"
    else
        log_warning "Service backend non trouvé, démarrage manuel requis"
    fi
    
    log_success "Backend déployé avec succès"
}

# Fonction pour déployer le frontend
deploy_frontend() {
    log "Déploiement du frontend..."
    
    cd "$FRONTEND_DIR"
    
    # Sauvegarder les modifications locales si nécessaire
    if ! git diff-index --quiet HEAD --; then
        log_warning "Modifications locales détectées, sauvegarde..."
        git stash push -m "Auto-sauvegarde avant déploiement $(date)"
    fi
    
    # Pull les dernières modifications
    log "Récupération des dernières modifications..."
    git pull origin master
    
    # Installer les dépendances si nécessaire
    if [ ! -d "node_modules" ] || [ "package.json" -nt "node_modules" ]; then
        log "Installation des dépendances..."
        npm install
    fi
    
    # Build du projet
    log "Compilation du projet..."
    npm run build
    
    # Redémarrer le service frontend
    log "Redémarrage du service frontend..."
    if systemctl is-active --quiet inventory-frontend; then
        sudo systemctl restart inventory-frontend
        log_success "Service frontend redémarré"
    else
        log_warning "Service frontend non trouvé, démarrage manuel requis"
    fi
    
    log_success "Frontend déployé avec succès"
}

# Fonction pour déployer tout
deploy_all() {
    log "Déploiement complet..."
    deploy_backend
    deploy_frontend
    log_success "Déploiement complet terminé"
}

# Fonction pour restaurer la base de données
restore_database() {
    log "Restauration de la base de données..."
    
    if [ -z "$1" ]; then
        log_error "Veuillez spécifier le fichier de sauvegarde à restaurer"
        echo "Usage: $0 restore <fichier_sauvegarde>"
        echo "Exemple: $0 restore /home/matt/backups/auto_backup_20241230_143022.sql.gz"
        exit 1
    fi
    
    BACKUP_FILE="$1"
    
    if [ ! -f "$BACKUP_FILE" ]; then
        log_error "Fichier de sauvegarde non trouvé: $BACKUP_FILE"
        exit 1
    fi
    
    # Vérifier si c'est un fichier compressé
    if [[ "$BACKUP_FILE" == *.gz ]]; then
        log "Décompression de la sauvegarde..."
        gunzip -c "$BACKUP_FILE" | psql -h localhost -U inventory_user -d inventory_db
    else
        psql -h localhost -U inventory_user -d inventory_db < "$BACKUP_FILE"
    fi
    
    if [ $? -eq 0 ]; then
        log_success "Base de données restaurée avec succès"
    else
        log_error "Erreur lors de la restauration"
        exit 1
    fi
}

# Fonction pour lister les sauvegardes disponibles
list_backups() {
    log "Sauvegardes disponibles:"
    BACKUP_DIR="/home/matt/backups"
    
    if [ -d "$BACKUP_DIR" ]; then
        ls -la "$BACKUP_DIR"/*.sql.gz 2>/dev/null | while read -r line; do
            echo "  $line"
        done
    else
        log_warning "Aucune sauvegarde trouvée"
    fi
}

# Fonction pour afficher l'aide
show_help() {
    echo "Script de déploiement automatique pour Inventory V2"
    echo ""
    echo "Usage: $0 [OPTION]"
    echo ""
    echo "Options:"
    echo "  backend    Déployer uniquement le backend"
    echo "  frontend   Déployer uniquement le frontend"
    echo "  all        Déployer backend et frontend (défaut)"
    echo "  restore    Restaurer la base de données"
    echo "  backups    Lister les sauvegardes disponibles"
    echo "  help       Afficher cette aide"
    echo ""
    echo "Exemples:"
    echo "  $0 backend"
    echo "  $0 frontend"
    echo "  $0 all"
    echo "  $0 restore /home/matt/backups/auto_backup_20241230_143022.sql.gz"
    echo "  $0 backups"
}

# Vérification des prérequis
check_prerequisites() {
    log "Vérification des prérequis..."
    
    # Vérifier que git est installé
    if ! command -v git &> /dev/null; then
        log_error "Git n'est pas installé"
        exit 1
    fi
    
    # Vérifier que npm est installé
    if ! command -v npm &> /dev/null; then
        log_error "NPM n'est pas installé"
        exit 1
    fi
    
    # Vérifier que le répertoire du projet existe
    if [ ! -d "$PROJECT_DIR" ]; then
        log_error "Le répertoire du projet n'existe pas: $PROJECT_DIR"
        exit 1
    fi
    
    log_success "Prérequis vérifiés"
}

# Fonction principale
main() {
    log "=== Début du déploiement ==="
    
    # Vérifier les prérequis
    check_prerequisites
    
    # Traitement des arguments
    case "${1:-all}" in
        "backend")
            deploy_backend
            ;;
        "frontend")
            deploy_frontend
            ;;
        "all")
            deploy_all
            ;;
        "restore")
            restore_database "$2"
            ;;
        "backups")
            list_backups
            ;;
        "help"|"-h"|"--help")
            show_help
            exit 0
            ;;
        *)
            log_error "Option invalide: $1"
            show_help
            exit 1
            ;;
    esac
    
    log "=== Déploiement terminé ==="
}

# Exécution du script
main "$@" 