package com.social.media.application.socialnetwork.handler;

import com.social.media.application.socialnetwork.query.GetSocialNetworkByIdQuery;
import com.social.media.application.socialnetwork.dto.SocialNetworkResponseDto;
import com.social.media.domain.socialnetwork.aggregate.SocialNetwork;
import com.social.media.domain.socialnetwork.repository.SocialNetworkRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Map;
import java.util.Optional;

/**
 * Handler for GetSocialNetworkByIdQuery
 */
@Service
public class GetSocialNetworkByIdQueryHandler {
    
    private final SocialNetworkRepository socialNetworkRepository;
    
    public GetSocialNetworkByIdQueryHandler(SocialNetworkRepository socialNetworkRepository) {
        this.socialNetworkRepository = socialNetworkRepository;
    }
    
    @Transactional(readOnly = true)
    public Optional<SocialNetworkResponseDto> handle(GetSocialNetworkByIdQuery query) {
        return socialNetworkRepository.findById(query.socialNetworkId())
            .map(this::mapToDto);
    }
    
    private SocialNetworkResponseDto mapToDto(SocialNetwork socialNetwork) {
        return SocialNetworkResponseDto.builder()
            .id(socialNetwork.getId().value().toString())
            .name(socialNetwork.getPlatformType().getCode())
            .displayName(socialNetwork.getDisplayName())
            .description(socialNetwork.getPlatformType().getDisplayName())
            .baseUrl(socialNetwork.getBaseUrl())
            .apiVersion("v1") // Default version
            .active(socialNetwork.isActive())
            .supportsPosting(socialNetwork.getCapabilities().supportsPosts())
            .supportsScheduling(false) // Default value
            .supportsAnalytics(false) // Default value
            .maxPostLength(socialNetwork.getCapabilities().characterLimitPost())
            .supportedMediaTypes(socialNetwork.getCapabilities().supportedMediaFormats())
            .authConfig(Map.of()) // Default empty config
            .apiLimits(Map.of()) // Default empty limits
            .createdAt(socialNetwork.getCreatedAt())
            .updatedAt(socialNetwork.getUpdatedAt())
            .build();
    }
}

