import { drizzle } from "drizzle-orm/mysql2";
import { eq } from "drizzle-orm";
import { users, formateurs } from "../drizzle/schema.ts";
import * as dotenv from "dotenv";

// Charger les variables d'environnement
dotenv.config();

/**
 * Script de migration pour synchroniser les utilisateurs avec role='formateur'
 * qui n'ont pas encore d'entrée dans la table formateurs
 */
async function migrateFormateurs() {
  console.log("[Migration] Démarrage de la synchronisation des formateurs...");
  
  if (!process.env.DATABASE_URL) {
    console.error("[Migration] DATABASE_URL non définie");
    process.exit(1);
  }

  const db = drizzle(process.env.DATABASE_URL);
  
  try {
    // Récupérer tous les utilisateurs avec role='formateur'
    const formateurUsers = await db
      .select()
      .from(users)
      .where(eq(users.role, 'formateur'));
    
    console.log(`[Migration] ${formateurUsers.length} utilisateur(s) avec role='formateur' trouvé(s)`);
    
    let created = 0;
    let updated = 0;
    let skipped = 0;
    
    for (const user of formateurUsers) {
      // Si l'utilisateur a déjà un formateurId, vérifier qu'il existe
      if (user.formateurId) {
        const existingFormateur = await db
          .select()
          .from(formateurs)
          .where(eq(formateurs.id, user.formateurId))
          .limit(1);
        
        if (existingFormateur.length > 0) {
          console.log(`[Migration] ✓ Utilisateur "${user.name}" (${user.email}) déjà lié au formateur ID ${user.formateurId}`);
          skipped++;
          continue;
        }
      }
      
      // Vérifier si l'utilisateur a un nom et un email
      if (!user.name || !user.email) {
        console.log(`[Migration] ⚠ Utilisateur ID ${user.id} ignoré (nom ou email manquant)`);
        skipped++;
        continue;
      }
      
      // Créer une entrée dans la table formateurs
      const formateurResult = await db.insert(formateurs).values({
        nom: user.name,
        email: user.email,
      });
      
      const newFormateurId = Number(formateurResult[0].insertId);
      
      // Mettre à jour l'utilisateur avec le formateurId
      await db
        .update(users)
        .set({ formateurId: newFormateurId })
        .where(eq(users.id, user.id));
      
      console.log(`[Migration] ✓ Créé formateur "${user.name}" (${user.email}) avec ID ${newFormateurId}`);
      created++;
    }
    
    console.log("\n[Migration] Résumé:");
    console.log(`  - Créés: ${created}`);
    console.log(`  - Mis à jour: ${updated}`);
    console.log(`  - Ignorés: ${skipped}`);
    console.log("[Migration] Terminé avec succès !");
    
  } catch (error) {
    console.error("[Migration] Erreur:", error);
    process.exit(1);
  }
  
  process.exit(0);
}

migrateFormateurs();
