package com.flightticket.controller;

import com.flightticket.dto.user.CreateUserRequest;
import com.flightticket.dto.user.UpdateUserRequest;
import com.flightticket.dto.user.UserResponse;
import com.flightticket.model.enums.Role;
import com.flightticket.security.annotation.RequiresSuperAdmin;
import com.flightticket.security.annotation.RequiresAgencyAdmin;
import com.flightticket.service.UserManagementService;
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/users")
@RequiredArgsConstructor
public class UserManagementController {
    
    private final UserManagementService userManagementService;
    
    @PostMapping
    @RequiresAgencyAdmin
    public ResponseEntity<UserResponse> createUser(
            @Valid @RequestBody CreateUserRequest request,
            Authentication authentication) {
        log.info("Create user request received: {}", request.getUsername());
        UUID createdBy = UUID.fromString(authentication.getName());
        UserResponse response = userManagementService.createUser(request, createdBy);
        return ResponseEntity.status(HttpStatus.CREATED).body(response);
    }
    
    @GetMapping("/{userId}")
    public ResponseEntity<UserResponse> getUserById(@PathVariable UUID userId) {
        log.info("Get user request for ID: {}", userId);
        UserResponse response = userManagementService.getUserById(userId);
        return ResponseEntity.ok(response);
    }
    
    @GetMapping("/agency/{agencyId}")
    @RequiresAgencyAdmin
    public ResponseEntity<List<UserResponse>> getUsersByAgency(@PathVariable UUID agencyId) {
        log.info("Get users by agency request for agency: {}", agencyId);
        List<UserResponse> responses = userManagementService.getUsersByAgency(agencyId);
        return ResponseEntity.ok(responses);
    }
    
    @PutMapping("/{userId}")
    public ResponseEntity<UserResponse> updateUser(
            @PathVariable UUID userId,
            @Valid @RequestBody UpdateUserRequest request) {
        log.info("Update user request for ID: {}", userId);
        UserResponse response = userManagementService.updateUser(userId, request);
        return ResponseEntity.ok(response);
    }
    
    @DeleteMapping("/{userId}")
    @RequiresAgencyAdmin
    public ResponseEntity<Void> deleteUser(@PathVariable UUID userId) {
        log.info("Delete user request for ID: {}", userId);
        userManagementService.deleteUser(userId);
        return ResponseEntity.noContent().build();
    }
    
    @PostMapping("/{userId}/roles/{role}")
    @RequiresSuperAdmin
    public ResponseEntity<Void> assignRole(
            @PathVariable UUID userId,
            @PathVariable Role role) {
        log.info("Assign role {} to user {}", role, userId);
        userManagementService.assignRole(userId, role);
        return ResponseEntity.ok().build();
    }
    
    @DeleteMapping("/{userId}/roles/{role}")
    @RequiresSuperAdmin
    public ResponseEntity<Void> revokeRole(
            @PathVariable UUID userId,
            @PathVariable Role role) {
        log.info("Revoke role {} from user {}", role, userId);
        userManagementService.revokeRole(userId, role);
        return ResponseEntity.ok().build();
    }
}
