package com.social.media.application.user.handler;

import com.social.media.application.user.command.RestoreUserCommand;
import com.social.media.domain.user.aggregate.User;
import com.social.media.domain.user.repository.UserRepository;
import com.social.media.domain.user.service.UserDomainService;
import com.social.media.domain.shared.exception.BusinessRuleViolationException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * Handler for RestoreUserCommand - restores a logically deleted user
 */
@Service
public class RestoreUserCommandHandler {
    
    private final UserRepository userRepository;
    private final UserDomainService userDomainService;
    
    public RestoreUserCommandHandler(UserRepository userRepository, UserDomainService userDomainService) {
        this.userRepository = userRepository;
        this.userDomainService = userDomainService;
    }
    
    @Transactional
    public void handle(RestoreUserCommand command) {
        User user = userRepository.findById(command.userId())
            .orElseThrow(() -> new BusinessRuleViolationException("User not found with ID: " + command.userId()));
        
        // Check if user is not deleted
        if (!user.isDeleted()) {
            throw new BusinessRuleViolationException("User is not deleted, cannot restore");
        }
        
        // Get user performing the restoration for validation
        User restoredBy = null;
        if (command.restoredBy() != null) {
            restoredBy = userRepository.findById(command.restoredBy())
                .orElseThrow(() -> new BusinessRuleViolationException("Restoring user not found"));
        }
        
        // Validate if the user performing restoration has permission
        // For now, using the same validation as user creation  
        userDomainService.validateUserCreation(user.getType(), user.getCompanyId(), restoredBy);
        
        // Restore user
        user.restore();
        userRepository.save(user);
    }
}
