/**
 * WhatsApp Queue Service
 *
 * Queues WhatsApp template message jobs to the Communication SQS queue.
 */

import { Injectable } from '@nestjs/common';
import { SqsClientService } from './sqs-client.service';
import { QueueWhatsAppDto } from '../dto/queue-whatsapp.dto';
import { WhatsAppQueueMessage } from '../interfaces/queue-message.interface';
import { QUEUE_CONSTANTS } from '../constants/queue.constants';
import { getQueueFeatureFlags, getQueueUrls } from '../config/sqs.config';
import { AppLoggerService } from 'src/common/services/logger.service';

@Injectable()
export class WhatsAppQueueService {
  private readonly queueUrl: string;
  private readonly queueEnabled: boolean;

  constructor(
    private readonly sqsClient: SqsClientService,
    private readonly logger: AppLoggerService,
  ) {
    const queueUrls = getQueueUrls();
    const featureFlags = getQueueFeatureFlags();

    this.queueUrl = queueUrls.communication || '';
    this.queueEnabled = featureFlags.communicationQueueEnabled && !!this.queueUrl;

    if (!this.queueEnabled) {
      this.logger.warn(
        'Communication queue is disabled or not configured. WhatsApp queue operations will be skipped.',
      );
    }
  }

  async queueWhatsAppMessage(
    messageData: QueueWhatsAppDto,
    correlationId?: string,
    userId?: string,
  ): Promise<string | null> {
    if (!this.queueEnabled) {
      this.logger.debug('WhatsApp queue is disabled - skipping queue operation');
      return null;
    }

    try {
      const message: WhatsAppQueueMessage = {
        queueType: QUEUE_CONSTANTS.QUEUE_TYPES.COMMUNICATION,
        subType: QUEUE_CONSTANTS.COMMUNICATION_TYPES.WHATSAPP,
        timestamp: new Date().toISOString(),
        correlationId: correlationId || `whatsapp-${Date.now()}`,
        userId: userId || messageData.userId,
        data: {
          phoneNumber: messageData.phoneNumber,
          templateName: messageData.templateName,
          parameters: messageData.parameters,
          broadcastName: messageData.broadcastName,
        },
        metadata: messageData.metadata,
      };

      const messageId = await this.sqsClient.sendMessage(this.queueUrl, message);
      this.logger.log(
        `WhatsApp message queued successfully: ${messageData.phoneNumber}, MessageId: ${messageId}`,
      );
      return messageId;
    } catch (error) {
      const errorMessage = error instanceof Error ? error.message : String(error);
      this.logger.error('Failed to queue WhatsApp message', '', {
        error: errorMessage,
        stack: error instanceof Error ? error.stack : undefined,
        phoneNumber: messageData.phoneNumber,
        templateName: messageData.templateName,
        correlationId,
        queueUrl: this.queueUrl,
      });
      return null;
    }
  }

  isQueueEnabled(): boolean {
    return this.queueEnabled;
  }

  getQueueUrl(): string {
    return this.queueUrl;
  }
}

