package com.social.media.application.user.handler;

import com.social.media.application.user.query.GetUserByIdQuery;
import com.social.media.application.user.dto.UserResponseDto;
import com.social.media.domain.user.aggregate.User;
import com.social.media.domain.user.repository.UserRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Map;
import java.util.Optional;

@Service
public class GetUserByIdQueryHandler {
    
    private final UserRepository userRepository;
    
    public GetUserByIdQueryHandler(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    @Transactional(readOnly = true)
    public Optional<UserResponseDto> handle(GetUserByIdQuery query) {
        return userRepository.findById(query.userId())
            .map(this::mapToResponseDto);
    }
    
    private UserResponseDto mapToResponseDto(User user) {
        return UserResponseDto.builder()
            .id(user.getId().value().toString())
            .name(user.getName())
            .email(user.getEmail().value())
            .phone(user.getPhone() != null ? user.getPhone().value() : null)
            .position(user.getPosition())
            .department(user.getDepartment())
            .status(user.getStatus().name())
            .companyId(user.getCompanyId().value().toString())
            .avatarUrl(user.getAvatarUrl())
            .emailVerified(user.isEmailVerified())
            .whatsappEnabled(user.isWhatsappEnabled())
            .lastAccessDate(user.getLastAccessDate())
            .permissions(user.getPermissions().permissions())
            .configuration(Map.of(
                "timezone", user.getConfiguration().timezone(),
                "language", user.getConfiguration().language(),
                "preferences", user.getConfiguration().preferences()
            ))
            .createdAt(user.getCreatedAt())
            .updatedAt(user.getUpdatedAt())
            .build();
    }
}

