package com.flightticket.controller;

import com.flightticket.dto.queue.ProcessQueueMessageRequest;
import com.flightticket.dto.queue.QueueMessageResponse;
import com.flightticket.security.annotation.RequiresSuperAdmin;
import com.flightticket.security.annotation.RequiresAgent;
import com.flightticket.service.QueueManagementService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.UUID;

@Slf4j
@RestController
@RequestMapping("/api/v1/queue")
@RequiredArgsConstructor
public class QueueManagementController {
    
    private final QueueManagementService queueManagementService;
    
    @GetMapping("/messages")
    @RequiresSuperAdmin
    public ResponseEntity<List<QueueMessageResponse>> retrieveQueueMessages(
            @RequestParam String queueNumber) {
        log.info("Retrieve queue messages request for queue: {}", queueNumber);
        List<QueueMessageResponse> messages = queueManagementService.retrieveQueueMessages(queueNumber);
        return ResponseEntity.ok(messages);
    }
    
    @GetMapping("/messages/agency/{agencyId}")
    @RequiresAgent
    public ResponseEntity<List<QueueMessageResponse>> getQueueMessagesByAgency(@PathVariable UUID agencyId) {
        log.info("Get queue messages for agency: {}", agencyId);
        List<QueueMessageResponse> messages = queueManagementService.getQueueMessagesByAgency(agencyId);
        return ResponseEntity.ok(messages);
    }
    
    @GetMapping("/messages/pending/agency/{agencyId}")
    @RequiresAgent
    public ResponseEntity<List<QueueMessageResponse>> getPendingQueueMessagesByAgency(@PathVariable UUID agencyId) {
        log.info("Get pending queue messages for agency: {}", agencyId);
        List<QueueMessageResponse> messages = queueManagementService.getPendingQueueMessagesByAgency(agencyId);
        return ResponseEntity.ok(messages);
    }
    
    @PostMapping("/messages/{messageId}/process")
    @RequiresAgent
    public ResponseEntity<QueueMessageResponse> processQueueMessage(
            @PathVariable UUID messageId,
            @Valid @RequestBody ProcessQueueMessageRequest request,
            Authentication authentication) {
        log.info("Process queue message {} by {}", messageId, authentication.getName());
        UUID processedBy = UUID.fromString(authentication.getName());
        QueueMessageResponse response = queueManagementService.processQueueMessage(messageId, request, processedBy);
        return ResponseEntity.ok(response);
    }
    
    @GetMapping("/messages/{messageId}")
    @RequiresAgent
    public ResponseEntity<QueueMessageResponse> getQueueMessageById(@PathVariable UUID messageId) {
        log.info("Get queue message by ID: {}", messageId);
        QueueMessageResponse response = queueManagementService.getQueueMessageById(messageId);
        return ResponseEntity.ok(response);
    }
}
