import { v } from 'convex/values';
import { mutation, query } from './_generated/server';
import { getCurrentUserFunction } from './auth';

/**
 * Obter preferências de notificação para uma conversa
 */
export const obterPreferenciasConversa = query({
	args: {
		conversaId: v.id('conversas')
	},
	returns: v.union(
		v.object({
			pushAtivado: v.boolean(),
			emailAtivado: v.boolean(),
			somAtivado: v.boolean(),
			silenciado: v.boolean(),
			apenasMencoes: v.boolean()
		}),
		v.null()
	),
	handler: async (ctx, args) => {
		const usuario = await getCurrentUserFunction(ctx);
		if (!usuario) return null;

		const preferencias = await ctx.db
			.query('preferenciasNotificacaoConversa')
			.withIndex('by_usuario_conversa', (q) =>
				q.eq('usuarioId', usuario._id).eq('conversaId', args.conversaId)
			)
			.first();

		if (!preferencias) {
			// Retornar valores padrão
			return {
				pushAtivado: true,
				emailAtivado: true,
				somAtivado: true,
				silenciado: false,
				apenasMencoes: false
			};
		}

		return {
			pushAtivado: preferencias.pushAtivado,
			emailAtivado: preferencias.emailAtivado,
			somAtivado: preferencias.somAtivado,
			silenciado: preferencias.silenciado,
			apenasMencoes: preferencias.apenasMencoes
		};
	}
});

/**
 * Atualizar preferências de notificação para uma conversa
 */
export const atualizarPreferenciasConversa = mutation({
	args: {
		conversaId: v.id('conversas'),
		pushAtivado: v.optional(v.boolean()),
		emailAtivado: v.optional(v.boolean()),
		somAtivado: v.optional(v.boolean()),
		silenciado: v.optional(v.boolean()),
		apenasMencoes: v.optional(v.boolean())
	},
	returns: v.object({ sucesso: v.boolean() }),
	handler: async (ctx, args) => {
		const usuario = await getCurrentUserFunction(ctx);
		if (!usuario) return { sucesso: false };

		// Verificar se usuário pertence à conversa
		const conversa = await ctx.db.get(args.conversaId);
		if (!conversa || !conversa.participantes.includes(usuario._id)) {
			return { sucesso: false };
		}

		const preferenciasExistentes = await ctx.db
			.query('preferenciasNotificacaoConversa')
			.withIndex('by_usuario_conversa', (q) =>
				q.eq('usuarioId', usuario._id).eq('conversaId', args.conversaId)
			)
			.first();

		const agora = Date.now();

		if (preferenciasExistentes) {
			// Atualizar preferências existentes
			await ctx.db.patch(preferenciasExistentes._id, {
				pushAtivado: args.pushAtivado ?? preferenciasExistentes.pushAtivado,
				emailAtivado: args.emailAtivado ?? preferenciasExistentes.emailAtivado,
				somAtivado: args.somAtivado ?? preferenciasExistentes.somAtivado,
				silenciado: args.silenciado ?? preferenciasExistentes.silenciado,
				apenasMencoes: args.apenasMencoes ?? preferenciasExistentes.apenasMencoes,
				atualizadoEm: agora
			});
		} else {
			// Criar novas preferências com valores padrão
			await ctx.db.insert('preferenciasNotificacaoConversa', {
				usuarioId: usuario._id,
				conversaId: args.conversaId,
				pushAtivado: args.pushAtivado ?? true,
				emailAtivado: args.emailAtivado ?? true,
				somAtivado: args.somAtivado ?? true,
				silenciado: args.silenciado ?? false,
				apenasMencoes: args.apenasMencoes ?? false,
				criadoEm: agora,
				atualizadoEm: agora
			});
		}

		return { sucesso: true };
	}
});
