package com.flightticket.controller;

import com.flightticket.dto.subscription.CreateSubscriptionPlanRequest;
import com.flightticket.dto.subscription.SubscriptionPlanResponse;
import com.flightticket.dto.subscription.UpdateSubscriptionPlanRequest;
import com.flightticket.model.entity.SubscriptionPlan;
import com.flightticket.security.annotation.RequiresSuperAdmin;
import com.flightticket.service.SubscriptionManagementService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
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.web.bind.annotation.*;

import java.util.Optional;
import java.util.UUID;

/**
 * REST controller for subscription management.
 */
@RestController
@RequestMapping("/api/admin/subscriptions")
@RequiresSuperAdmin
@RequiredArgsConstructor
@Slf4j
@Tag(name = "Subscription Management", description = "APIs for managing agency subscription plans")
public class SubscriptionManagementController {
    
    private final SubscriptionManagementService subscriptionManagementService;
    
    @PostMapping
    @Operation(summary = "Create subscription plan", description = "Create a new subscription plan for an agency")
    public ResponseEntity<SubscriptionPlanResponse> createSubscriptionPlan(
        @Valid @RequestBody CreateSubscriptionPlanRequest request
    ) {
        log.info("Creating subscription plan for agency {}", request.getAgencyId());
        
        SubscriptionPlan plan = subscriptionManagementService.createSubscriptionPlan(
            request.getAgencyId(),
            request.getSubscriptionType(),
            request.getMonthlyFee(),
            request.getCurrency()
        );
        
        return ResponseEntity.status(HttpStatus.CREATED).body(toResponse(plan));
    }
    
    @GetMapping("/{agencyId}")
    @Operation(summary = "Get agency subscription", description = "Get the active subscription plan for an agency")
    public ResponseEntity<SubscriptionPlanResponse> getAgencySubscription(
        @PathVariable UUID agencyId
    ) {
        log.info("Fetching subscription plan for agency {}", agencyId);
        
        Optional<SubscriptionPlan> planOpt = subscriptionManagementService.getActiveSubscriptionPlan(agencyId);
        
        return planOpt
            .map(plan -> ResponseEntity.ok(toResponse(plan)))
            .orElse(ResponseEntity.notFound().build());
    }
    
    @PutMapping("/{planId}")
    @Operation(summary = "Update subscription plan", description = "Update an existing subscription plan")
    public ResponseEntity<SubscriptionPlanResponse> updateSubscriptionPlan(
        @PathVariable UUID planId,
        @Valid @RequestBody UpdateSubscriptionPlanRequest request
    ) {
        log.info("Updating subscription plan {}", planId);
        
        SubscriptionPlan plan = subscriptionManagementService.updateSubscriptionPlan(
            planId,
            request.getSubscriptionType(),
            request.getMonthlyFee(),
            request.getCurrency()
        );
        
        return ResponseEntity.ok(toResponse(plan));
    }
    
    @DeleteMapping("/{planId}")
    @Operation(summary = "Deactivate subscription plan", description = "Deactivate a subscription plan")
    public ResponseEntity<Void> deactivateSubscriptionPlan(@PathVariable UUID planId) {
        log.info("Deactivating subscription plan {}", planId);
        
        subscriptionManagementService.deactivateSubscriptionPlan(planId);
        
        return ResponseEntity.noContent().build();
    }
    
    private SubscriptionPlanResponse toResponse(SubscriptionPlan plan) {
        SubscriptionPlanResponse response = new SubscriptionPlanResponse();
        response.setId(plan.getId());
        response.setAgencyId(plan.getAgencyId());
        response.setSubscriptionType(plan.getSubscriptionType());
        response.setMonthlyFee(plan.getMonthlyFee());
        response.setCurrency(plan.getCurrency());
        response.setActive(plan.getActive());
        response.setCreatedAt(plan.getCreatedAt());
        response.setUpdatedAt(plan.getUpdatedAt());
        return response;
    }
}
