package com.flightticket.controller;

import com.flightticket.dto.booking.BookingResponse;
import com.flightticket.dto.booking.CreateBookingRequest;
import com.flightticket.security.annotation.RequiresAgent;
import com.flightticket.service.BookingService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
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/bookings")
@RequiredArgsConstructor
public class BookingController {
    
    private final BookingService bookingService;
    
    @PostMapping
    @RequiresAgent
    public ResponseEntity<BookingResponse> createBooking(
            @Valid @RequestBody CreateBookingRequest request,
            @RequestParam UUID agencyId,
            Authentication authentication) {
        log.info("Create booking request for agency {} by agent {}", agencyId, authentication.getName());
        UUID agentId = UUID.fromString(authentication.getName());
        BookingResponse response = bookingService.createBooking(request, agencyId, agentId);
        return ResponseEntity.status(HttpStatus.CREATED).body(response);
    }
    
    @GetMapping("/{bookingId}")
    @RequiresAgent
    public ResponseEntity<BookingResponse> getBooking(@PathVariable UUID bookingId) {
        log.info("Get booking request for ID: {}", bookingId);
        BookingResponse response = bookingService.getBookingResponse(bookingId);
        return ResponseEntity.ok(response);
    }
    
    @GetMapping("/agency/{agencyId}")
    @RequiresAgent
    public ResponseEntity<List<BookingResponse>> getBookingsByAgency(@PathVariable UUID agencyId) {
        log.info("Get bookings by agency request for agency: {}", agencyId);
        List<BookingResponse> responses = bookingService.getBookingsByAgency(agencyId);
        return ResponseEntity.ok(responses);
    }
    
    @PostMapping("/{bookingId}/cancel")
    @RequiresAgent
    public ResponseEntity<Void> cancelBooking(
            @PathVariable UUID bookingId,
            Authentication authentication) {
        log.info("Cancel booking request for ID: {} by {}", bookingId, authentication.getName());
        UUID cancelledBy = UUID.fromString(authentication.getName());
        bookingService.cancelBooking(bookingId, cancelledBy);
        return ResponseEntity.ok().build();
    }
}
