import { QUEUE_CONSTANTS } from '../constants/queue.constants';

export interface QueueErrorClassification {
  code: string;
  message: string;
  stack?: string;
  retryable: boolean;
}

export const classifyQueueError = (error: unknown): QueueErrorClassification => {
  const message = error instanceof Error ? error.message : String(error);
  const stack = error instanceof Error ? error.stack : undefined;
  const lower = message.toLowerCase();

  if (lower.includes('timeout') || lower.includes('network') || lower.includes('econnreset')) {
    return {
      code: QUEUE_CONSTANTS.ERROR_TYPES.NETWORK_ERROR,
      message,
      stack,
      retryable: true,
    };
  }

  if (lower.includes('rate limit') || lower.includes('throttle') || lower.includes('too many requests')) {
    return {
      code: QUEUE_CONSTANTS.ERROR_TYPES.RATE_LIMIT_ERROR,
      message,
      stack,
      retryable: true,
    };
  }

  if (lower.includes('validation') || lower.includes('invalid') || lower.includes('bad request')) {
    return {
      code: QUEUE_CONSTANTS.ERROR_TYPES.VALIDATION_ERROR,
      message,
      stack,
      retryable: false,
    };
  }

  if (lower.includes('service unavailable') || lower.includes('503')) {
    return {
      code: QUEUE_CONSTANTS.ERROR_TYPES.SERVICE_UNAVAILABLE,
      message,
      stack,
      retryable: true,
    };
  }

  return {
    code: QUEUE_CONSTANTS.ERROR_TYPES.PROCESSING_ERROR,
    message,
    stack,
    retryable: true,
  };
};
