#!/bin/bash

# Script de correction COMPLÈTE et DÉFINITIVE du schéma de base de données
# Formation Manager Itinova - Janvier 2026
# Ce script corrige TOUTES les colonnes manquantes identifiées

DB_USER="app_user"
DB_PASS="Itinova69!"
DB_NAME="formation_manager"

echo "=========================================="
echo "CORRECTION DÉFINITIVE DU SCHÉMA"
echo "Formation Manager Itinova"
echo "=========================================="
echo ""
echo "⚠️  Ce script va MODIFIER la base de données"
echo "Appuyez sur Entrée pour continuer ou Ctrl+C pour annuler..."
read

echo ""
echo "=== DÉBUT DES CORRECTIONS ==="
echo ""

# Fonction pour exécuter une requête SQL avec gestion d'erreur
execute_sql() {
    local description="$1"
    local query="$2"
    echo "→ $description"
    result=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "$query" 2>&1 | grep -v "Warning: Using a password")
    if [ -z "$result" ]; then
        echo "  ✓ OK"
        return 0
    else
        if echo "$result" | grep -q "Duplicate column name"; then
            echo "  ⚠ Colonne existe déjà"
            return 0
        elif echo "$result" | grep -q "Can't DROP"; then
            echo "  ⚠ Colonne n'existe pas"
            return 0
        else
            echo "  ✗ Erreur: $result"
            return 1
        fi
    fi
}

echo "=========================================="
echo "1. CORRECTION DE LA TABLE formateurs"
echo "=========================================="

# CRITIQUE: La colonne email manque dans formateurs
execute_sql "Ajout de la colonne email" \
"ALTER TABLE formateurs ADD COLUMN email VARCHAR(320) AFTER nom;"

echo ""
echo "=========================================="
echo "2. CORRECTION DE LA TABLE rappels"
echo "=========================================="

# CRITIQUE: La colonne timing manque dans rappels
execute_sql "Ajout de la colonne timing" \
"ALTER TABLE rappels ADD COLUMN timing ENUM('pre_formation', 'post_formation') NOT NULL DEFAULT 'pre_formation' AFTER heureEnvoi;"

execute_sql "Ajout de la colonne nomFichier" \
"ALTER TABLE rappels ADD COLUMN nomFichier VARCHAR(255) AFTER timing;"

execute_sql "Ajout de la colonne urlFichier" \
"ALTER TABLE rappels ADD COLUMN urlFichier VARCHAR(500) AFTER nomFichier;"

execute_sql "Ajout de la colonne s3Key" \
"ALTER TABLE rappels ADD COLUMN s3Key VARCHAR(500) AFTER urlFichier;"

execute_sql "Ajout de la colonne typeFichier" \
"ALTER TABLE rappels ADD COLUMN typeFichier VARCHAR(100) AFTER s3Key;"

execute_sql "Ajout de la colonne tailleFichier" \
"ALTER TABLE rappels ADD COLUMN tailleFichier INT AFTER typeFichier;"

execute_sql "Ajout de la colonne derniereExecution" \
"ALTER TABLE rappels ADD COLUMN derniereExecution DATETIME AFTER actif;"

execute_sql "Modification de l'ENUM templateType" \
"ALTER TABLE rappels MODIFY COLUMN templateType ENUM('rappel', 'rappelJ1', 'rappel3', 'rappel4', 'rappel5', 'rappel6') NOT NULL;"

echo ""
echo "=========================================="
echo "3. CORRECTION DE LA TABLE sequences"
echo "=========================================="

execute_sql "Modification de l'ENUM statut" \
"ALTER TABLE sequences MODIFY COLUMN statut ENUM('ouverte','bloquee','terminee','fermee','annulee') NOT NULL DEFAULT 'ouverte';"

execute_sql "Modification de l'ENUM publicCible" \
"ALTER TABLE sequences MODIFY COLUMN publicCible ENUM('directeur','chef_service','autre','tous') NOT NULL DEFAULT 'tous';"

execute_sql "Modification de la taille de lieu" \
"ALTER TABLE sequences MODIFY COLUMN lieu VARCHAR(255) NOT NULL;"

execute_sql "Modification de la taille de qrCodeToken" \
"ALTER TABLE sequences MODIFY COLUMN qrCodeToken VARCHAR(100) UNIQUE;"

echo ""
echo "=========================================="
echo "4. CORRECTION DE LA TABLE formations"
echo "=========================================="

execute_sql "Ajout de la colonne modeAttestation" \
"ALTER TABLE formations ADD COLUMN modeAttestation ENUM('auto', 'manuel') NOT NULL DEFAULT 'auto' AFTER actif;"

execute_sql "Ajout de la colonne modeEnvoi" \
"ALTER TABLE formations ADD COLUMN modeEnvoi ENUM('auto', 'manuel') NOT NULL DEFAULT 'manuel' AFTER modeAttestation;"

echo ""
echo "=========================================="
echo "5. CORRECTION DE LA TABLE users"
echo "=========================================="

execute_sql "Ajout de la colonne username" \
"ALTER TABLE users ADD COLUMN username VARCHAR(100) UNIQUE AFTER email;"

execute_sql "Ajout de la colonne password" \
"ALTER TABLE users ADD COLUMN password VARCHAR(255) AFTER username;"

execute_sql "Ajout de la colonne isActive" \
"ALTER TABLE users ADD COLUMN isActive BOOLEAN NOT NULL DEFAULT TRUE AFTER role;"

execute_sql "Ajout de la colonne formateurId" \
"ALTER TABLE users ADD COLUMN formateurId INT AFTER isActive;"

execute_sql "Modification de l'ENUM role" \
"ALTER TABLE users MODIFY COLUMN role ENUM('user', 'admin', 'formateur') NOT NULL DEFAULT 'user';"

echo ""
echo "=========================================="
echo "6. CORRECTION DE LA TABLE apprenants"
echo "=========================================="

execute_sql "Modification de codeEtablissement" \
"ALTER TABLE apprenants MODIFY COLUMN codeEtablissement VARCHAR(50) NULL;"

execute_sql "Modification de fonction" \
"ALTER TABLE apprenants MODIFY COLUMN fonction VARCHAR(100) NULL;"

echo ""
echo "=========================================="
echo "7. CORRECTION DE LA TABLE emailConfig"
echo "=========================================="

execute_sql "Modification de l'ENUM provider" \
"ALTER TABLE emailConfig MODIFY COLUMN provider ENUM('resend', 'smtp', 'simulation') NOT NULL DEFAULT 'simulation';"

echo ""
echo "=========================================="
echo "8. CORRECTION DE LA TABLE emailTemplates"
echo "=========================================="

execute_sql "Modification de l'ENUM type" \
"ALTER TABLE emailTemplates MODIFY COLUMN type ENUM('inscription', 'teaser', 'rappel', 'rappelJ1', 'rappel3', 'rappel4', 'rappel5', 'rappel6') NOT NULL UNIQUE;"

echo ""
echo "=========================================="
echo "9. CORRECTION DE LA TABLE logsRappels"
echo "=========================================="

execute_sql "Ajout de la colonne email" \
"ALTER TABLE logsRappels ADD COLUMN email VARCHAR(320) NOT NULL AFTER apprenantId;"

execute_sql "Modification de l'ENUM type" \
"ALTER TABLE logsRappels MODIFY COLUMN type ENUM('rappel', 'rappelJ1', 'rappel3', 'rappel4', 'rappel5', 'rappel6') NOT NULL;"

echo ""
echo "=========================================="
echo "10. CORRECTION DE LA TABLE questionnaires"
echo "=========================================="

# Vérifier si la colonne nom existe et la renommer en titre
result=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -se "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='$DB_NAME' AND TABLE_NAME='questionnaires' AND COLUMN_NAME='nom';" 2>/dev/null)

if [ "$result" = "1" ]; then
    execute_sql "Renommage de nom en titre" \
    "ALTER TABLE questionnaires CHANGE COLUMN nom titre VARCHAR(255) NOT NULL;"
else
    echo "→ La colonne titre existe déjà"
fi

echo ""
echo "=========================================="
echo "11. CORRECTION DE LA TABLE reponsesQuestionnaires"
echo "=========================================="

# Vérifier si la colonne complete existe et la supprimer
result=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -se "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='$DB_NAME' AND TABLE_NAME='reponsesQuestionnaires' AND COLUMN_NAME='complete';" 2>/dev/null)

if [ "$result" = "1" ]; then
    execute_sql "Suppression de la colonne complete" \
    "ALTER TABLE reponsesQuestionnaires DROP COLUMN complete;"
else
    echo "→ La colonne complete n'existe pas (OK)"
fi

echo ""
echo "=========================================="
echo "12. CORRECTION DE LA TABLE attestations"
echo "=========================================="

execute_sql "Ajout de la colonne documentUrl" \
"ALTER TABLE attestations ADD COLUMN documentUrl VARCHAR(500) AFTER s3Key;"

execute_sql "Ajout de la colonne documentS3Key" \
"ALTER TABLE attestations ADD COLUMN documentS3Key VARCHAR(500) AFTER documentUrl;"

execute_sql "Ajout de la colonne uploadedBy" \
"ALTER TABLE attestations ADD COLUMN uploadedBy INT AFTER documentS3Key;"

execute_sql "Ajout de la colonne uploadedAt" \
"ALTER TABLE attestations ADD COLUMN uploadedAt TIMESTAMP AFTER uploadedBy;"

execute_sql "Ajout de la colonne emailEnvoye" \
"ALTER TABLE attestations ADD COLUMN emailEnvoye BOOLEAN NOT NULL DEFAULT FALSE AFTER uploadedAt;"

execute_sql "Ajout de la colonne dateEnvoiEmail" \
"ALTER TABLE attestations ADD COLUMN dateEnvoiEmail TIMESTAMP AFTER emailEnvoye;"

echo ""
echo "=========================================="
echo "13. CORRECTION DE LA TABLE parametres"
echo "=========================================="

# Supprimer envoiAutomatiqueAttestations si elle existe
result=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -se "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='$DB_NAME' AND TABLE_NAME='parametres' AND COLUMN_NAME='envoiAutomatiqueAttestations';" 2>/dev/null)

if [ "$result" = "1" ]; then
    execute_sql "Suppression de la colonne envoiAutomatiqueAttestations" \
    "ALTER TABLE parametres DROP COLUMN envoiAutomatiqueAttestations;"
else
    echo "→ La colonne envoiAutomatiqueAttestations n'existe pas (OK)"
fi

execute_sql "Ajout de la colonne urlPublique" \
"ALTER TABLE parametres ADD COLUMN urlPublique VARCHAR(500) NOT NULL DEFAULT 'https://formations.itinova.org' AFTER id;"

execute_sql "Ajout de la colonne delaiExpirationQR" \
"ALTER TABLE parametres ADD COLUMN delaiExpirationQR INT NOT NULL DEFAULT 30 AFTER urlPublique;"

execute_sql "Ajout de la colonne dureeValiditeToken" \
"ALTER TABLE parametres ADD COLUMN dureeValiditeToken INT NOT NULL DEFAULT 24 AFTER delaiExpirationQR;"

execute_sql "Ajout de la colonne notificationsActives" \
"ALTER TABLE parametres ADD COLUMN notificationsActives BOOLEAN NOT NULL DEFAULT TRUE AFTER dureeValiditeToken;"

echo ""
echo "=========================================="
echo "14. CORRECTION DES AUTRES TABLES"
echo "=========================================="

execute_sql "Ajout de userId dans passwordResetTokens" \
"ALTER TABLE passwordResetTokens ADD COLUMN userId INT NOT NULL AFTER id;"

execute_sql "Ajout de ordre dans datesFormation" \
"ALTER TABLE datesFormation ADD COLUMN ordre INT NOT NULL AFTER sequenceId;"

execute_sql "Ajout de validateurId dans presences" \
"ALTER TABLE presences ADD COLUMN validateurId INT AFTER modeValidation;"

echo ""
echo "=========================================="
echo "✅ TOUTES LES CORRECTIONS APPLIQUÉES"
echo "=========================================="
echo ""

# Compter les tables
total_tables=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -se "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='$DB_NAME';" 2>/dev/null)

echo "✓ Nombre total de tables: $total_tables"
echo ""
echo "=== PROCHAINES ÉTAPES ==="
echo "1. Redémarrer l'application: pm2 restart formation-manager"
echo "2. Vérifier les logs: pm2 logs formation-manager --lines 30"
echo "3. Tester l'application dans le navigateur"
echo ""
echo "=========================================="
