import { internalMutation, query } from "./_generated/server";
import { v } from "convex/values";

/**
 * Verificar duplicatas de matrícula
 */
export const verificarDuplicatas = query({
  args: {},
  returns: v.array(
    v.object({
      matricula: v.string(),
      count: v.number(),
      usuarios: v.array(
        v.object({
          _id: v.id("usuarios"),
          nome: v.string(),
          email: v.string(),
        })
      ),
    })
  ),
  handler: async (ctx) => {
    const usuarios = await ctx.db.query("usuarios").collect();
    
    // Agrupar por matrícula
    const gruposPorMatricula = usuarios.reduce((acc, usuario) => {
      if (!acc[usuario.matricula]) {
        acc[usuario.matricula] = [];
      }
      acc[usuario.matricula].push({
        _id: usuario._id,
        nome: usuario.nome,
        email: usuario.email || "",
      });
      return acc;
    }, {} as Record<string, any[]>);
    
    // Filtrar apenas duplicatas
    const duplicatas = Object.entries(gruposPorMatricula)
      .filter(([_, usuarios]) => usuarios.length > 1)
      .map(([matricula, usuarios]) => ({
        matricula,
        count: usuarios.length,
        usuarios,
      }));
    
    return duplicatas;
  },
});

/**
 * Remover duplicatas mantendo apenas o mais recente
 */
export const removerDuplicatas = internalMutation({
  args: {},
  returns: v.object({
    removidos: v.number(),
    matriculas: v.array(v.string()),
  }),
  handler: async (ctx) => {
    const usuarios = await ctx.db.query("usuarios").collect();
    
    // Agrupar por matrícula
    const gruposPorMatricula = usuarios.reduce((acc, usuario) => {
      if (!acc[usuario.matricula]) {
        acc[usuario.matricula] = [];
      }
      acc[usuario.matricula].push(usuario);
      return acc;
    }, {} as Record<string, any[]>);
    
    let removidos = 0;
    const matriculasDuplicadas: string[] = [];
    
    // Para cada grupo com duplicatas
    for (const [matricula, usuariosGrupo] of Object.entries(gruposPorMatricula)) {
      if (usuariosGrupo.length > 1) {
        matriculasDuplicadas.push(matricula);
        
        // Ordenar por _creationTime (mais recente primeiro)
        usuariosGrupo.sort((a, b) => b._creationTime - a._creationTime);
        
        // Manter o primeiro (mais recente) e remover os outros
        for (let i = 1; i < usuariosGrupo.length; i++) {
          await ctx.db.delete(usuariosGrupo[i]._id);
          removidos++;
          console.log(`🗑️ Removido usuário duplicado: ${usuariosGrupo[i].nome} (matrícula: ${matricula})`);
        }
        
        console.log(`✅ Mantido usuário: ${usuariosGrupo[0].nome} (matrícula: ${matricula})`);
      }
    }
    
    return {
      removidos,
      matriculas: matriculasDuplicadas,
    };
  },
});




