import { internalMutation, query } from './_generated/server';
import { v } from 'convex/values';
import { Id, Doc } from './_generated/dataModel';

/**
 * Verificar duplicatas de matrícula (agora busca do funcionário associado)
 */
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 do funcionário associado
		const gruposPorMatricula: Record<
			string,
			Array<{ _id: Id<'usuarios'>; nome: string; email: string }>
		> = {};

		for (const usuario of usuarios) {
			let matricula: string | undefined = undefined;
			if (usuario.funcionarioId) {
				const funcionario = await ctx.db.get(usuario.funcionarioId);
				matricula = funcionario?.matricula;
			}

			if (matricula) {
				if (!gruposPorMatricula[matricula]) {
					gruposPorMatricula[matricula] = [];
				}
				gruposPorMatricula[matricula].push({
					_id: usuario._id,
					nome: usuario.nome,
					email: usuario.email || ''
				});
			}
		}

		// 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 (agora busca do funcionário associado)
 */
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 do funcionário associado
		const gruposPorMatricula: Record<string, Doc<'usuarios'>[]> = {};

		for (const usuario of usuarios) {
			let matricula: string | undefined = undefined;
			if (usuario.funcionarioId) {
				const funcionario = await ctx.db.get(usuario.funcionarioId);
				matricula = funcionario?.matricula;
			}

			if (matricula) {
				if (!gruposPorMatricula[matricula]) {
					gruposPorMatricula[matricula] = [];
				}
				gruposPorMatricula[matricula].push(usuario);
			}
		}

		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
		};
	}
});
