import { sendMessage } from '../utils/messaging'; import { createTask, assignTask, completeTask, getPendingTasks } from '../../services/taskService'; import { setRemindersEnabled } from '../../services/userService'; function formatTaskList(tasks: any[]) { if (tasks.length === 0) { return 'No tienes tareas pendientes.'; } return tasks.map((task) => { return `- Tarea ${task.id}: ${task.description}${task.dueDate ? ` (para el ${task.dueDate})` : ''}`; }).join('\n'); } export function handleTaskCommand(body: string, sender: string, groupId: string, linkedGroups: Set) { if (groupId && linkedGroups.has(groupId)) { if (body.startsWith('/tarea')) { const command = body.replace('/tarea', '').trim(); const [action, ...args] = command.split(' '); const description = args.join(' '); // Extract WhatsApp mention (format: @) const assignedUserMatch = description.match(/@\d+/); const assignedUser = assignedUserMatch ? assignedUserMatch[0] : null; // Validate phone number format if (assignedUser && !/^@\d{8,}$/.test(assignedUser)) { sendMessage(sender, 'Formato de mención inválido. Usa @ seguido del número de teléfono'); return; } const dueDateMatch = description.match(/\d{4}-\d{2}-\d{2}/); const dueDate = dueDateMatch ? dueDateMatch[0] : null; const cleanDescription = description .replace(/@\w+/g, '') .replace(/\d{4}-\d{2}-\d{2}/g, '') .trim(); if (!action || action === 'mostrar') { // Handle bare /tarea or /tarea mostrar const user = `@${sender.split('@')[0]}`; // Default to the sender const tasks = getPendingTasks(user); if (tasks.length === 0) { sendMessage(sender, 'No tienes tareas pendientes.'); } else { const taskList = formatTaskList(tasks); sendMessage(sender, `Tus tareas pendientes:\n${taskList}`); } } else if (action === 'nueva') { try { const finalAssignedUser = assignedUser || `@${sender.split('@')[0]}`; const task = createTask(sender, { description: cleanDescription, assignedTo: finalAssignedUser, dueDate: dueDate || undefined }); let message = `✅ Tarea creada:\nID: ${task.id}\nDescripción: ${task.description}`; if (task.assignedTo) message += `\nAsignada a: ${task.assignedTo}`; if (task.dueDate) message += `\nFecha límite: ${task.dueDate}`; message += `\nCreada: ${task.createdAt}`; // Send confirmation privately to creator sendMessage(sender, message); // Also notify assignee if different from creator if (assignedUser && assignedUser !== `@${sender.split('@')[0]}`) { sendMessage(assignedUser, `📝 Se te ha asignado una nueva tarea:\n${message}`); } } catch (error) { console.error('Error creating task:', error); sendMessage(sender, `❌ Error al crear la tarea: ${error.message}`); } } else if (action === 'asignar') { try { const taskId = validateTaskId(args[0]); if (!assignedUser) { throw new Error('Debes mencionar a un usuario para asignar la tarea. Ejemplo: /tarea asignar 1 @12345678'); } assignTask(taskId, assignedUser); // Send confirmation privately to the person who assigned sendMessage(sender, `✅ Tarea ${taskId} asignada a ${assignedUser}`); // Notify the new assignee privately sendMessage(assignedUser, `📝 Se te ha asignado la tarea ${taskId}`); } catch (error) { console.error('Error assigning task:', error); sendMessage(sender, `❌ Error al asignar tarea: ${error.message}`); } } else if (action === 'lista' || (!action && args.length === 1)) { // Handle both /tarea lista 14 and /tarea 14 try { const taskId = validateTaskId(args[0]); const task = getTaskById(taskId); if (!task) { sendMessage(sender, `Tarea ${taskId} no encontrada`); return; } // Check if task is assigned to current user const currentUser = `@${sender.split('@')[0]}`; if (task.assignedTo !== currentUser) { sendMessage(sender, `No puedes completar la tarea ${taskId} porque no está asignada a ti`); return; } completeTask(taskId); // Send confirmation privately to the user who completed sendMessage(sender, `✅ Tarea ${taskId} completada: ${task.description}`); // Notify the task creator if different from completer if (task.createdBy && task.createdBy !== sender) { sendMessage(task.createdBy, `✅ Tarea ${taskId} completada por @${sender.split('@')[0]}: ${task.description}`); } } catch (error) { console.error('Error completing task:', error); sendMessage(sender, `❌ Error al completar tarea: ${error.message}`); } } else if (action === 'mostrar' || !action) { // Handle /tarea or /tarea mostrar const user = `@${sender.split('@')[0]}`; // Default to the sender const tasks = getPendingTasks(user); if (tasks.length === 0) { sendMessage(sender, 'No tienes tareas pendientes.'); } else { const taskList = tasks.map((task) => { return `- Tarea ${task.id}: ${task.description}${task.dueDate ? ` (para el ${task.dueDate})` : ''}`; }).join('\n'); // Always send task list privately sendMessage(sender, `Tus tareas pendientes:\n${taskList}`); } } else if (action === 'recordatorios') { const enable = args[0]?.toLowerCase(); if (enable === 'on' || enable === 'off') { const phoneNumber = sender.split('@')[0]; setRemindersEnabled(phoneNumber, enable === 'on'); // Send reminder settings confirmation privately sendMessage(sender, `Recordatorios ${enable === 'on' ? 'activados' : 'desactivados'}`); } else { sendMessage(sender, 'Usa /tarea recordatorios on|off para gestionar tus recordatorios'); } } else { sendMessage(sender, 'Acción no reconocida. Usa /tarea nueva, /tarea asignar, /tarea completar, /tarea mostrar, o /tarea recordatorios.'); } } } }