// ABOUTME: Utility for moving failed BullMQ jobs to the dead letter queue
// ABOUTME: Provides a reusable helper used by all worker 'failed' event handlers

import { Job } from 'bullmq';
import { deadLetterQueue } from '../workers/queue';
import logger from './logger';

/**
 * Move a job that has exhausted all retries to the dead letter queue.
 *
 * Captures the original job data, error details, source queue, and timestamp
 * so that operators can inspect, replay, or alert on persistently failing jobs.
 *
 * @param job  - The BullMQ job that failed (must not be undefined)
 * @param error - The error that caused the final failure
 */
export async function moveToDeadLetter(job: Job, error: Error): Promise<void> {
  try {
    await deadLetterQueue.add('failed-job', {
      ...job.data,
      _failedReason: error.message,
      _sourceQueue: job.queueName,
      _failedAt: new Date().toISOString(),
      _originalJobId: job.id,
      _stackTrace: error.stack,
      _attemptsMade: job.attemptsMade,
    });

    logger.error(
      {
        jobId: job.id,
        queue: job.queueName,
        error: error.message,
        attemptsMade: job.attemptsMade,
      },
      'Job moved to dead letter queue after exhausting retries'
    );
  } catch (dlqError) {
    // Failing to enqueue to the dead letter queue should not crash the worker.
    // Log the failure so operators can investigate.
    logger.error(
      {
        jobId: job.id,
        queue: job.queueName,
        originalError: error.message,
        dlqError: dlqError instanceof Error ? dlqError.message : 'Unknown error',
      },
      'Failed to move job to dead letter queue'
    );
  }
}
