package com.social.media.application.socialnetwork.service;

import com.social.media.application.socialnetwork.command.CreateSocialNetworkCommand;
import com.social.media.application.socialnetwork.command.UpdateSocialNetworkCommand;
import com.social.media.application.socialnetwork.query.GetSocialNetworkByIdQuery;
import com.social.media.application.socialnetwork.query.GetAllActiveSocialNetworksQuery;
import com.social.media.application.socialnetwork.dto.SocialNetworkResponseDto;
import com.social.media.application.socialnetwork.handler.*;
import com.social.media.domain.socialnetwork.valueobject.SocialNetworkId;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

/**
 * Application Service for Social Network operations
 * Orchestrates commands and queries using handlers
 */
@Service
public class SocialNetworkApplicationService {
    
    private final CreateSocialNetworkCommandHandler createSocialNetworkCommandHandler;
    private final UpdateSocialNetworkCommandHandler updateSocialNetworkCommandHandler;
    private final GetSocialNetworkByIdQueryHandler getSocialNetworkByIdQueryHandler;
    private final GetAllActiveSocialNetworksQueryHandler getAllActiveSocialNetworksQueryHandler;
    
    public SocialNetworkApplicationService(
            CreateSocialNetworkCommandHandler createSocialNetworkCommandHandler,
            UpdateSocialNetworkCommandHandler updateSocialNetworkCommandHandler,
            GetSocialNetworkByIdQueryHandler getSocialNetworkByIdQueryHandler,
            GetAllActiveSocialNetworksQueryHandler getAllActiveSocialNetworksQueryHandler) {
        this.createSocialNetworkCommandHandler = createSocialNetworkCommandHandler;
        this.updateSocialNetworkCommandHandler = updateSocialNetworkCommandHandler;
        this.getSocialNetworkByIdQueryHandler = getSocialNetworkByIdQueryHandler;
        this.getAllActiveSocialNetworksQueryHandler = getAllActiveSocialNetworksQueryHandler;
    }
    
    // Command operations
    public SocialNetworkResponseDto createSocialNetwork(CreateSocialNetworkCommand command) {
        return createSocialNetworkCommandHandler.handle(command);
    }
    
    public SocialNetworkResponseDto updateSocialNetwork(UpdateSocialNetworkCommand command) {
        return updateSocialNetworkCommandHandler.handle(command);
    }
    
    // Query operations
    public Optional<SocialNetworkResponseDto> getSocialNetworkById(SocialNetworkId socialNetworkId) {
        return getSocialNetworkByIdQueryHandler.handle(new GetSocialNetworkByIdQuery(socialNetworkId));
    }
    
    public List<SocialNetworkResponseDto> getAllActiveSocialNetworks() {
        return getAllActiveSocialNetworksQueryHandler.handle(new GetAllActiveSocialNetworksQuery());
    }
}

