package com.flightticket.controller;

import com.flightticket.dto.backoffice.*;
import com.flightticket.security.annotation.RequiresSuperAdmin;
import com.flightticket.service.BackOfficeService;
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;

@Slf4j
@RestController
@RequestMapping("/api/v1/backoffice")
@RequiredArgsConstructor
public class BackOfficeController {
    
    private final BackOfficeService backOfficeService;
    
    @GetMapping("/dashboard")
    @RequiresSuperAdmin
    public ResponseEntity<DashboardMetrics> getDashboardMetrics() {
        log.info("Get dashboard metrics request");
        DashboardMetrics metrics = backOfficeService.getDashboardMetrics();
        return ResponseEntity.ok(metrics);
    }
    
    @PostMapping("/wallet/adjust")
    @RequiresSuperAdmin
    public ResponseEntity<ManualWalletAdjustmentResponse> adjustWalletBalance(
            @Valid @RequestBody ManualWalletAdjustmentRequest request,
            Authentication authentication) {
        log.info("Manual wallet adjustment request for agency {} by {}", 
                request.getAgencyId(), authentication.getName());
        String adjustedBy = authentication.getName();
        ManualWalletAdjustmentResponse response = backOfficeService.adjustWalletBalance(request, adjustedBy);
        return ResponseEntity.ok(response);
    }
    
    @PostMapping("/impersonate")
    @RequiresSuperAdmin
    public ResponseEntity<ImpersonationResponse> impersonateUser(
            @Valid @RequestBody ImpersonationRequest request,
            Authentication authentication) {
        log.info("Impersonation request for user {} by {}", 
                request.getTargetUserId(), authentication.getName());
        String impersonatingUserId = authentication.getName();
        ImpersonationResponse response = backOfficeService.startImpersonation(request, impersonatingUserId);
        return ResponseEntity.ok(response);
    }
    
    @PostMapping("/impersonate/end")
    @RequiresSuperAdmin
    public ResponseEntity<Void> endImpersonation(
            @RequestParam String sessionId,
            Authentication authentication) {
        log.info("End impersonation request for session {} by {}", 
                sessionId, authentication.getName());
        String impersonatingUserId = authentication.getName();
        backOfficeService.endImpersonation(sessionId, impersonatingUserId);
        return ResponseEntity.ok().build();
    }
    
    @GetMapping("/configuration/{key}")
    @RequiresSuperAdmin
    public ResponseEntity<SystemConfigurationResponse> getConfiguration(@PathVariable String key) {
        log.info("Get system configuration request for key: {}", key);
        SystemConfigurationResponse response = backOfficeService.getConfiguration(key);
        return ResponseEntity.ok(response);
    }
    
    @GetMapping("/configuration")
    @RequiresSuperAdmin
    public ResponseEntity<List<SystemConfigurationResponse>> getAllConfigurations(
            @RequestParam(required = false) String category) {
        log.info("Get all system configurations request with category: {}", category);
        List<SystemConfigurationResponse> responses = backOfficeService.getAllConfigurations(category);
        return ResponseEntity.ok(responses);
    }
    
    @PutMapping("/configuration")
    @RequiresSuperAdmin
    public ResponseEntity<SystemConfigurationResponse> updateConfiguration(
            @Valid @RequestBody SystemConfigurationRequest request,
            Authentication authentication) {
        log.info("Update system configuration request by {}", authentication.getName());
        String updatedBy = authentication.getName();
        SystemConfigurationResponse response = backOfficeService.updateConfiguration(request, updatedBy);
        return ResponseEntity.ok(response);
    }
    
    @DeleteMapping("/configuration/{key}")
    @RequiresSuperAdmin
    public ResponseEntity<Void> deleteConfiguration(
            @PathVariable String key,
            Authentication authentication) {
        log.info("Delete system configuration request for key: {} by {}", key, authentication.getName());
        String deletedBy = authentication.getName();
        backOfficeService.deleteConfiguration(key, deletedBy);
        return ResponseEntity.noContent().build();
    }
}
