package com.flightticket.service;

import com.flightticket.dto.queue.ProcessQueueMessageRequest;
import com.flightticket.dto.queue.QueueMessageResponse;
import com.flightticket.model.enums.QueueMessageStatus;
import com.flightticket.model.enums.QueueMessageType;

import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;

/**
 * Service for managing Amadeus queue messages
 * Requirements: 19.1, 19.2, 19.3, 19.4, 19.5
 */
public interface QueueManagementService {
    
    /**
     * Retrieve queue messages from Amadeus and store them
     * Requirements: 19.1
     * 
     * @param queueNumber The queue number to retrieve messages from
     * @return List of retrieved queue messages
     */
    List<QueueMessageResponse> retrieveQueueMessages(String queueNumber);
    
    /**
     * Get all queue messages for a specific agency
     * Requirements: 19.4
     * 
     * @param agencyId The agency ID
     * @return List of queue messages for the agency
     */
    List<QueueMessageResponse> getQueueMessagesByAgency(UUID agencyId);
    
    /**
     * Get all queue messages by status
     * Requirements: 19.2
     * 
     * @param status The message status
     * @return List of queue messages with the specified status
     */
    List<QueueMessageResponse> getQueueMessagesByStatus(QueueMessageStatus status);
    
    /**
     * Get all queue messages by PNR
     * Requirements: 19.4
     * 
     * @param pnr The PNR reference
     * @return List of queue messages for the PNR
     */
    List<QueueMessageResponse> getQueueMessagesByPnr(String pnr);
    
    /**
     * Get all queue messages by type
     * Requirements: 19.3
     * 
     * @param messageType The message type
     * @return List of queue messages of the specified type
     */
    List<QueueMessageResponse> getQueueMessagesByType(QueueMessageType messageType);
    
    /**
     * Get pending queue messages for an agency
     * Requirements: 19.2, 19.4
     * 
     * @param agencyId The agency ID
     * @return List of pending queue messages for the agency
     */
    List<QueueMessageResponse> getPendingQueueMessagesByAgency(UUID agencyId);
    
    /**
     * Get queue messages within a date range
     * Requirements: 19.5
     * 
     * @param startDate Start date
     * @param endDate End date
     * @return List of queue messages within the date range
     */
    List<QueueMessageResponse> getQueueMessagesByDateRange(LocalDateTime startDate, LocalDateTime endDate);
    
    /**
     * Process a queue message
     * Requirements: 19.2, 19.5
     * 
     * @param messageId The queue message ID
     * @param request The processing request with action taken and notes
     * @param processedBy The user ID who processed the message
     * @return The processed queue message
     */
    QueueMessageResponse processQueueMessage(UUID messageId, ProcessQueueMessageRequest request, UUID processedBy);
    
    /**
     * Mark a queue message as failed
     * Requirements: 19.5
     * 
     * @param messageId The queue message ID
     * @param reason The failure reason
     * @param processedBy The user ID who marked it as failed
     * @return The updated queue message
     */
    QueueMessageResponse markQueueMessageAsFailed(UUID messageId, String reason, UUID processedBy);
    
    /**
     * Mark a queue message as ignored
     * Requirements: 19.5
     * 
     * @param messageId The queue message ID
     * @param reason The reason for ignoring
     * @param processedBy The user ID who ignored it
     * @return The updated queue message
     */
    QueueMessageResponse markQueueMessageAsIgnored(UUID messageId, String reason, UUID processedBy);
    
    /**
     * Get a single queue message by ID
     * Requirements: 19.2
     * 
     * @param messageId The queue message ID
     * @return The queue message
     */
    QueueMessageResponse getQueueMessageById(UUID messageId);
}
