#!/usr/bin/env node

/**
 * Script de réinitialisation de l'utilisateur administrateur
 * Crée ou réinitialise l'utilisateur adminServFormation avec le mot de passe par défaut
 */

import { drizzle } from 'drizzle-orm/mysql2';
import { eq } from 'drizzle-orm';
import mysql from 'mysql2/promise';
import bcrypt from 'bcryptjs';
import { users } from './drizzle/schema.js';

const DEFAULT_USERNAME = 'adminServFormation';
const DEFAULT_PASSWORD = 'Itinova69!';
const DEFAULT_EMAIL = 'admin@formation.local';

async function resetAdmin() {
  console.log('╔════════════════════════════════════════════════════════════════╗');
  console.log('║   Réinitialisation de l\'utilisateur administrateur             ║');
  console.log('╚════════════════════════════════════════════════════════════════╝');
  console.log('');

  // Vérifier que DATABASE_URL est définie
  if (!process.env.DATABASE_URL) {
    console.error('❌ [ERREUR] DATABASE_URL n\'est pas définie dans .env');
    process.exit(1);
  }

  console.log('📋 Informations de l\'utilisateur:');
  console.log(`   Identifiant: ${DEFAULT_USERNAME}`);
  console.log(`   Mot de passe: ${DEFAULT_PASSWORD}`);
  console.log(`   Email: ${DEFAULT_EMAIL}`);
  console.log(`   Rôle: admin`);
  console.log('');

  try {
    // Créer la connexion à la base de données
    console.log('🔌 Connexion à la base de données...');
    const connection = await mysql.createConnection(process.env.DATABASE_URL);
    const db = drizzle(connection);
    console.log('✅ Connexion établie');
    console.log('');

    // Hasher le mot de passe
    console.log('🔐 Hashage du mot de passe...');
    const hashedPassword = await bcrypt.hash(DEFAULT_PASSWORD, 10);
    console.log('✅ Mot de passe hashé');
    console.log('');

    // Vérifier si l'utilisateur existe déjà
    console.log('🔍 Vérification de l\'existence de l\'utilisateur...');
    const existingUsers = await db
      .select()
      .from(users)
      .where(eq(users.username, DEFAULT_USERNAME))
      .limit(1);

    if (existingUsers.length > 0) {
      console.log('⚠️  L\'utilisateur existe déjà');
      console.log('🔄 Mise à jour du mot de passe...');
      
      await db
        .update(users)
        .set({
          password: hashedPassword,
          email: DEFAULT_EMAIL,
          role: 'admin',
          isActive: true,
          updatedAt: new Date(),
        })
        .where(eq(users.username, DEFAULT_USERNAME));
      
      console.log('✅ Mot de passe réinitialisé avec succès');
    } else {
      console.log('➕ L\'utilisateur n\'existe pas, création...');
      
      await db.insert(users).values({
        username: DEFAULT_USERNAME,
        password: hashedPassword,
        email: DEFAULT_EMAIL,
        name: 'Administrateur',
        role: 'admin',
        isActive: true,
        createdAt: new Date(),
        updatedAt: new Date(),
      });
      
      console.log('✅ Utilisateur créé avec succès');
    }

    console.log('');
    console.log('╔════════════════════════════════════════════════════════════════╗');
    console.log('║              Réinitialisation terminée avec succès!            ║');
    console.log('╚════════════════════════════════════════════════════════════════╝');
    console.log('');
    console.log('🔑 Vous pouvez maintenant vous connecter avec:');
    console.log(`   Identifiant: ${DEFAULT_USERNAME}`);
    console.log(`   Mot de passe: ${DEFAULT_PASSWORD}`);
    console.log('');
    console.log('⚠️  IMPORTANT: Changez le mot de passe après la première connexion');
    console.log('');

    await connection.end();
    process.exit(0);
  } catch (error) {
    console.error('');
    console.error('❌ [ERREUR] Une erreur est survenue:');
    console.error(error.message);
    console.error('');
    
    if (error.code === 'ER_NO_SUCH_TABLE') {
      console.error('💡 La table "users" n\'existe pas.');
      console.error('   Exécutez: pnpm db:push');
    } else if (error.code === 'ECONNREFUSED') {
      console.error('💡 Impossible de se connecter à la base de données.');
      console.error('   Vérifiez que MySQL est démarré et que DATABASE_URL est correct.');
    }
    
    console.error('');
    process.exit(1);
  }
}

// Exécuter le script
resetAdmin();
