package com.social.media.application.socialnetwork.handler;

import com.social.media.application.socialnetwork.command.CreateSocialNetworkCommand;
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 com.social.media.domain.socialnetwork.valueobject.PlatformCapabilities;
import com.social.media.domain.shared.exception.BusinessRuleViolationException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Map;

/**
 * Handler for CreateSocialNetworkCommand
 */
@Service
@Transactional
public class CreateSocialNetworkCommandHandler {
    
    private final SocialNetworkRepository socialNetworkRepository;
    
    public CreateSocialNetworkCommandHandler(SocialNetworkRepository socialNetworkRepository) {
        this.socialNetworkRepository = socialNetworkRepository;
    }
    
    public SocialNetworkResponseDto handle(CreateSocialNetworkCommand command) {
        // Validate business rules
        validateNameNotExists(command.name());
        validatePlatformNotExists(command.platformType());
        
        // Create value objects
        PlatformCapabilities capabilities = new PlatformCapabilities(
            command.supportsPosting(),
            false, // supportsStories
            true,  // supportsVideos
            false, // supportsReels
            false, // supportsLive
            false, // supportsDirectMessages
            command.maxPostLength(),
            500,   // characterLimitBio
            command.supportedMediaTypes()
        );
        
        // Create social network aggregate
        SocialNetwork socialNetwork = SocialNetwork.create(
            command.platformType(),
            command.displayName(),
            command.baseUrl(),
            capabilities
        );
        
        // Save social network
        SocialNetwork savedSocialNetwork = socialNetworkRepository.save(socialNetwork);
        
        // Return DTO
        return mapToDto(savedSocialNetwork);
    }
    
    private void validateNameNotExists(String name) {
        if (socialNetworkRepository.existsByName(name)) {
            throw new BusinessRuleViolationException("Social network with name already exists: " + name);
        }
    }
    
    private void validatePlatformNotExists(com.social.media.domain.socialnetwork.valueobject.PlatformType platformType) {
        if (socialNetworkRepository.existsByPlatformType(platformType)) {
            throw new BusinessRuleViolationException("Social network with platform type already exists: " + platformType);
        }
    }
    
    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();
    }
}

