/**
 * Script: change-user-email
 *
 * Cambia el correo de un usuario, resetea su contraseña a una temporal
 * y reenvía el correo de bienvenida con las nuevas credenciales.
 *
 * Ejecución:
 *   cd apps/api && npx tsx scripts/change-user-email.ts
 */
import { PrismaClient } from '@prisma/client';
import bcrypt from 'bcryptjs';
import { randomBytes } from 'crypto';
import { emailService } from '../src/services/email/email.service.js';

const prisma = new PrismaClient();

const OLD_EMAIL = 'eduardo.corona@corpcyl.com';
const NEW_EMAIL = 'miguel.corona@corpcyl.com';

function generateTempPassword(length = 12): string {
  const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789';
  let result = '';
  const bytes = randomBytes(length);
  for (let i = 0; i < length; i++) {
    result += chars[bytes[i] % chars.length];
  }
  return result + '!';
}

async function main() {
  const user = await prisma.user.findUnique({ where: { email: OLD_EMAIL } });
  if (!user) {
    console.error(`❌ No existe un usuario con el correo ${OLD_EMAIL}`);
    process.exit(1);
  }

  const existing = await prisma.user.findUnique({ where: { email: NEW_EMAIL } });
  if (existing) {
    console.error(`❌ Ya existe un usuario con el correo ${NEW_EMAIL}`);
    process.exit(1);
  }

  const tempPassword = generateTempPassword();
  const passwordHash = await bcrypt.hash(tempPassword, 12);

  await prisma.user.update({
    where: { id: user.id },
    data: {
      email: NEW_EMAIL,
      passwordHash,
      tokenVersion: { increment: 1 },
    },
  });

  await emailService.sendWelcome(NEW_EMAIL, {
    nombre: user.nombre,
    email: NEW_EMAIL,
    tempPassword,
  });

  console.log('✅ Correo actualizado:', OLD_EMAIL, '→', NEW_EMAIL);
  console.log('✅ Contraseña temporal generada y enviada por correo');
  console.log('   Nombre:', user.nombre);
  console.log('   Email:', NEW_EMAIL);
  console.log('   Contraseña temporal:', tempPassword);
}

main()
  .catch((e) => {
    console.error('\n❌ Error:', e);
    process.exit(1);
  })
  .finally(async () => {
    await prisma.$disconnect();
  });
