package com.social.media.application.user.handler;

import com.social.media.application.user.query.GetUsersByCompanyQuery;
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.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class GetUsersByCompanyQueryHandler {
    
    private final UserRepository userRepository;
    
    public GetUsersByCompanyQueryHandler(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    @Transactional(readOnly = true)
    public List<UserResponseDto> handle(GetUsersByCompanyQuery query) {
        return userRepository.findByCompany(query.companyId())
            .stream()
            .map(this::mapToResponseDto)
            .collect(Collectors.toList());
    }
    
    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();
    }
}

