#!/bin/bash

###############################################################################
# Script de mise à jour automatique
# Formation Manager Itinova
# 
# Ce script met à jour l'application sur le serveur VPS
###############################################################################

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

# 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

# Configuration
APP_DIR="/var/www/formation-manager-itinova"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICE_NAME="formation-manager-itinova"

echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║  Mise à jour Formation Manager Itinova                    ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo "Date: $(date)"
echo "Répertoire: $APP_DIR"
echo ""

# Vérifier que le script est exécuté en tant que root ou avec sudo
if [ "$EUID" -ne 0 ]; then 
    echo -e "${RED}✗ Ce script doit être exécuté en tant que root ou avec sudo${NC}"
    exit 1
fi

# Fonction pour afficher une étape
step() {
    echo ""
    echo -e "${BLUE}▶ $1${NC}"
    echo "────────────────────────────────────────────────────────────"
}

# Fonction pour confirmer
confirm() {
    read -p "$(echo -e ${YELLOW}$1 [y/N]: ${NC})" -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        echo -e "${RED}Mise à jour annulée${NC}"
        exit 1
    fi
}

# 1. Confirmation
confirm "Voulez-vous continuer avec la mise à jour ?"

# 2. Créer une sauvegarde
step "Étape 1/8: Création d'une sauvegarde de sécurité"
if [ -f "$SCRIPT_DIR/backup-before-update.sh" ]; then
    bash "$SCRIPT_DIR/backup-before-update.sh"
else
    echo -e "${YELLOW}⚠ Script de sauvegarde introuvable, sauvegarde manuelle recommandée${NC}"
    confirm "Continuer sans sauvegarde automatique ?"
fi

# 3. Arrêter le service
step "Étape 2/8: Arrêt du service"
if systemctl is-active --quiet $SERVICE_NAME; then
    systemctl stop $SERVICE_NAME
    echo -e "${GREEN}✓ Service arrêté${NC}"
else
    echo -e "${YELLOW}⚠ Service déjà arrêté${NC}"
fi

# 4. Sauvegarder le fichier .env
step "Étape 3/8: Sauvegarde de la configuration"
if [ -f "$APP_DIR/.env" ]; then
    cp "$APP_DIR/.env" "/tmp/.env.backup"
    echo -e "${GREEN}✓ Configuration sauvegardée dans /tmp/.env.backup${NC}"
else
    echo -e "${YELLOW}⚠ Fichier .env introuvable${NC}"
fi

# 5. Copier les nouveaux fichiers
step "Étape 4/8: Copie des nouveaux fichiers"
if [ -d "$SCRIPT_DIR/../" ]; then
    # Supprimer les anciens fichiers (sauf .env et node_modules)
    cd "$APP_DIR"
    find . -mindepth 1 -maxdepth 1 ! -name '.env' ! -name 'node_modules' ! -name '.git' -exec rm -rf {} +
    
    # Copier les nouveaux fichiers
    cp -r "$SCRIPT_DIR/../"* "$APP_DIR/"
    cp -r "$SCRIPT_DIR/../".* "$APP_DIR/" 2>/dev/null || true
    
    echo -e "${GREEN}✓ Nouveaux fichiers copiés${NC}"
else
    echo -e "${RED}✗ Répertoire source introuvable${NC}"
    exit 1
fi

# 6. Restaurer le fichier .env
step "Étape 5/8: Restauration de la configuration"
if [ -f "/tmp/.env.backup" ]; then
    cp "/tmp/.env.backup" "$APP_DIR/.env"
    rm "/tmp/.env.backup"
    echo -e "${GREEN}✓ Configuration restaurée${NC}"
else
    echo -e "${YELLOW}⚠ Pas de configuration à restaurer${NC}"
fi

# 7. Installer les dépendances
step "Étape 6/8: Installation des dépendances"
cd "$APP_DIR"

# Vérifier si pnpm est installé
if ! command -v pnpm &> /dev/null; then
    echo -e "${YELLOW}Installation de pnpm...${NC}"
    npm install -g pnpm
fi

echo "Installation des dépendances..."
pnpm install
echo -e "${GREEN}✓ Dépendances installées${NC}"

# 8. Appliquer les migrations de base de données
step "Étape 7/8: Application des migrations de base de données"
echo "Synchronisation du schéma de base de données..."
pnpm db:push
echo -e "${GREEN}✓ Migrations appliquées${NC}"

# 9. Construire l'application
step "Étape 8/8: Construction de l'application"
echo "Construction du client..."
cd "$APP_DIR"
pnpm run build 2>/dev/null || echo -e "${YELLOW}⚠ Pas de build client nécessaire${NC}"
echo -e "${GREEN}✓ Application construite${NC}"

# 10. Définir les permissions correctes
echo ""
echo -e "${YELLOW}Configuration des permissions...${NC}"
chown -R www-data:www-data "$APP_DIR"
chmod -R 755 "$APP_DIR"
chmod 600 "$APP_DIR/.env" 2>/dev/null || true
echo -e "${GREEN}✓ Permissions configurées${NC}"

# 11. Redémarrer le service
echo ""
echo -e "${YELLOW}Redémarrage du service...${NC}"
systemctl start $SERVICE_NAME
sleep 3

# Vérifier que le service a bien démarré
if systemctl is-active --quiet $SERVICE_NAME; then
    echo -e "${GREEN}✓ Service démarré avec succès${NC}"
else
    echo -e "${RED}✗ Erreur lors du démarrage du service${NC}"
    echo "Vérifier les logs avec: sudo journalctl -u $SERVICE_NAME -n 50"
    exit 1
fi

# 12. Vérifier le statut
echo ""
systemctl status $SERVICE_NAME --no-pager

# Résumé final
echo ""
echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║  ${GREEN}Mise à jour terminée avec succès !${BLUE}                     ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${GREEN}L'application est maintenant à jour et en cours d'exécution.${NC}"
echo ""
echo "Commandes utiles:"
echo "  • Voir les logs: sudo journalctl -u $SERVICE_NAME -f"
echo "  • Redémarrer: sudo systemctl restart $SERVICE_NAME"
echo "  • Statut: sudo systemctl status $SERVICE_NAME"
echo ""
