import { QueueType } from '../constants/queue.constants';
import { InvoiceContextEnum } from 'src/common/enum/invoice-context.enum';
export interface BaseQueueMessage {
    messageId?: string;
    queueType: QueueType;
    subType: string;
    timestamp: string;
    attemptCount?: number;
    correlationId?: string;
    userId?: string;
    metadata?: Record<string, any>;
}
export interface EmailQueueMessage extends BaseQueueMessage {
    queueType: 'communication';
    subType: 'email';
    data: {
        to: {
            emailAddress: string;
            name?: string;
        };
        from: {
            address: string;
            name: string;
        };
        subject: string;
        htmlBody?: string;
        textBody?: string;
        templateKey?: string;
        templateData?: Record<string, any>;
        cc?: Array<{
            emailAddress: string;
            name?: string;
        }>;
        bcc?: Array<{
            emailAddress: string;
            name?: string;
        }>;
        attachments?: Array<{
            name: string;
            content?: string;
            s3Key?: string;
            s3Bucket?: string;
            contentType: string;
        }>;
        replyTo?: {
            emailAddress: string;
            name?: string;
        };
    };
}
export interface BulkEmailQueueMessage extends BaseQueueMessage {
    queueType: 'communication';
    subType: 'bulk-email';
    data: {
        from: {
            address: string;
            name: string;
        };
        subject: string;
        templateKey?: string;
        recipients: Array<{
            emailAddress: string;
            name?: string;
            templateData?: Record<string, any>;
            registrationId?: number;
        }>;
        attachments?: Array<{
            name: string;
            s3Key: string;
            contentType: string;
            s3Bucket?: string;
        }>;
    };
}
export interface WhatsAppQueueMessage extends BaseQueueMessage {
    queueType: 'communication';
    subType: 'whatsapp';
    data: {
        phoneNumber: string;
        templateName: string;
        parameters?: Array<{
            name: string;
            value: string;
        }>;
        broadcastName?: string;
    };
}
export interface BulkWhatsAppQueueMessage extends BaseQueueMessage {
    queueType: 'communication';
    subType: 'bulk-whatsapp';
    data: {
        templateName: string;
        broadcastName: string;
        recipients: Array<{
            whatsappNumber: string;
            customParams?: Array<{
                name: string;
                value: string;
            }>;
            registrationId?: number;
        }>;
        globalParameters?: Array<{
            name: string;
            value: string;
        }>;
    };
}
export interface SmsQueueMessage extends BaseQueueMessage {
    queueType: 'communication';
    subType: 'sms';
    data: {
        phoneNumber: string;
        message: string;
        senderId?: string;
        dltTemplateId?: string;
        unicode?: boolean;
    };
}
export interface InvoiceQueueMessage extends BaseQueueMessage {
    queueType: 'heavy-processing';
    subType: 'invoice';
    data: {
        registrationId: number;
        userId?: number;
        invoiceContext: InvoiceContextEnum;
        sendEmail?: boolean;
        sendWhatsApp?: boolean;
    };
}
export interface JoinLinkGenerationQueueMessage extends BaseQueueMessage {
    queueType: 'event';
    subType: 'join-link-generation';
    data: {
        programSessionId: number;
        role?: string;
        batchSize?: number;
        actorUserId?: number;
    };
}
export interface SessionCommunicationTriggerQueueMessage extends BaseQueueMessage {
    queueType: 'event';
    subType: 'session-communication-trigger';
    data: {
        programId: number;
        purpose: string;
        actorUserId?: number;
    };
}
export type QueueMessage = EmailQueueMessage | BulkEmailQueueMessage | WhatsAppQueueMessage | BulkWhatsAppQueueMessage | SmsQueueMessage | InvoiceQueueMessage | JoinLinkGenerationQueueMessage | SessionCommunicationTriggerQueueMessage;
export interface SqsMessageWrapper {
    MessageId: string;
    ReceiptHandle: string;
    Body: string;
    Attributes?: Record<string, any>;
    MessageAttributes?: Record<string, any>;
    MD5OfBody?: string;
}
export interface QueueProcessingResult {
    success: boolean;
    messageId: string;
    queueType: QueueType;
    processingTimeMs: number;
    error?: {
        code: string;
        message: string;
        stack?: string;
        retryable: boolean;
    };
}
export interface QueueMetrics {
    queueType: QueueType;
    messagesProcessed: number;
    messagesSucceeded: number;
    messagesFailed: number;
    averageProcessingTimeMs: number;
    lastProcessedAt?: string;
}
