package com.flightticket.controller;

import com.flightticket.model.entity.Ticket;
import com.flightticket.security.annotation.RequiresAgent;
import com.flightticket.service.PdfTicketGenerationService;
import com.flightticket.service.TicketingService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
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/tickets")
@RequiredArgsConstructor
public class TicketingController {
    
    private final TicketingService ticketingService;
    private final PdfTicketGenerationService pdfTicketGenerationService;
    
    @PostMapping("/issue")
    @RequiresAgent
    public ResponseEntity<Ticket> issueTicket(
            @RequestParam UUID bookingId,
            Authentication authentication) {
        log.info("Issue ticket request for booking {} by {}", bookingId, authentication.getName());
        UUID issuedBy = UUID.fromString(authentication.getName());
        Ticket ticket = ticketingService.issueTicket(bookingId, issuedBy);
        return ResponseEntity.status(HttpStatus.CREATED).body(ticket);
    }
    
    @GetMapping("/{ticketId}")
    @RequiresAgent
    public ResponseEntity<Ticket> getTicket(@PathVariable UUID ticketId) {
        log.info("Get ticket request for ID: {}", ticketId);
        Ticket ticket = ticketingService.getTicket(ticketId);
        return ResponseEntity.ok(ticket);
    }
    
    @GetMapping("/agency/{agencyId}")
    @RequiresAgent
    public ResponseEntity<List<Ticket>> getTicketsByAgency(@PathVariable UUID agencyId) {
        log.info("Get tickets by agency request for agency: {}", agencyId);
        List<Ticket> tickets = ticketingService.getTicketsByAgency(agencyId);
        return ResponseEntity.ok(tickets);
    }
    
    @PostMapping("/{ticketId}/void")
    @RequiresAgent
    public ResponseEntity<TicketingService.VoidResult> voidTicket(
            @PathVariable UUID ticketId,
            Authentication authentication) {
        log.info("Void ticket request for ID: {} by {}", ticketId, authentication.getName());
        UUID voidedBy = UUID.fromString(authentication.getName());
        TicketingService.VoidResult result = ticketingService.voidTicket(ticketId, voidedBy);
        return ResponseEntity.ok(result);
    }
    
    @PostMapping("/{ticketId}/refund")
    @RequiresAgent
    public ResponseEntity<TicketingService.RefundResult> refundTicket(
            @PathVariable UUID ticketId,
            Authentication authentication) {
        log.info("Refund ticket request for ID: {} by {}", ticketId, authentication.getName());
        UUID refundedBy = UUID.fromString(authentication.getName());
        TicketingService.RefundResult result = ticketingService.refundTicket(ticketId, refundedBy);
        return ResponseEntity.ok(result);
    }
    
    @GetMapping("/{ticketId}/pdf")
    @RequiresAgent
    public ResponseEntity<byte[]> exportTicketAsPdf(@PathVariable UUID ticketId) {
        log.info("Export ticket as PDF request for ID: {}", ticketId);
        
        byte[] pdfBytes = pdfTicketGenerationService.generateTicketPdf(ticketId);
        
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_PDF);
        headers.setContentDispositionFormData("attachment", "ticket-" + ticketId + ".pdf");
        headers.setContentLength(pdfBytes.length);
        
        return new ResponseEntity<>(pdfBytes, headers, HttpStatus.OK);
    }
}
