/**
 * Invoice Queue Service
 *
 * Queues invoice/proforma invoice PDF generation jobs to the Heavy Processing SQS queue.
 */

import { Injectable } from '@nestjs/common';
import { SqsClientService } from './sqs-client.service';
import { QueueInvoiceDto } from '../dto/queue-invoice.dto';
import { InvoiceQueueMessage } 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 InvoiceQueueService {
  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.heavyProcessing || '';
    this.queueEnabled = featureFlags.heavyProcessingQueueEnabled && !!this.queueUrl;

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

  async queueInvoiceGeneration(
    invoiceData: QueueInvoiceDto,
    correlationId?: string,
  ): Promise<string | null> {
    if (!this.queueEnabled) {
      this.logger.debug('Invoice queue is disabled - skipping queue operation');
      return null;
    }

    try {
      const message: InvoiceQueueMessage = {
        queueType: QUEUE_CONSTANTS.QUEUE_TYPES.HEAVY_PROCESSING,
        subType: QUEUE_CONSTANTS.HEAVY_PROCESSING_TYPES.INVOICE,
        timestamp: new Date().toISOString(),
        correlationId: correlationId || `invoice-${Date.now()}`,
        userId: invoiceData.userId?.toString(),
        data: {
          registrationId: invoiceData.registrationId,
          userId: invoiceData.userId,
          invoiceContext: invoiceData.invoiceContext,
          sendEmail: invoiceData.sendEmail ?? true,
          sendWhatsApp: invoiceData.sendWhatsApp ?? false,
        },
      };

      const messageId = await this.sqsClient.sendMessage(this.queueUrl, message);
      this.logger.log(
        `Invoice job queued successfully: registrationId=${invoiceData.registrationId}, context=${invoiceData.invoiceContext}, MessageId=${messageId}`,
      );
      return messageId;
    } catch (error) {
      const errorMessage = error instanceof Error ? error.message : String(error);
      this.logger.error('Failed to queue invoice job', '', {
        error: errorMessage,
        stack: error instanceof Error ? error.stack : undefined,
        registrationId: invoiceData.registrationId,
        invoiceContext: invoiceData.invoiceContext,
        correlationId,
        queueUrl: this.queueUrl,
      });
      return null;
    }
  }

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

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

