package com.social.media.application.analytics.handler;

import com.social.media.application.analytics.command.UpdateAnalyticsReportCommand;
import com.social.media.application.analytics.dto.AnalyticsResponseDto;
import com.social.media.domain.analytics.aggregate.AnalyticsReport;
import com.social.media.domain.analytics.repository.AnalyticsReportRepository;
import com.social.media.domain.analytics.valueobject.AnalyticsId;
import com.social.media.domain.shared.exception.BusinessRuleViolationException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * Handler for UpdateAnalyticsReportCommand
 */
@Service
public class UpdateAnalyticsReportCommandHandler {
    
    private final AnalyticsReportRepository analyticsReportRepository;
    
    public UpdateAnalyticsReportCommandHandler(AnalyticsReportRepository analyticsReportRepository) {
        this.analyticsReportRepository = analyticsReportRepository;
    }
    
    @Transactional
    public AnalyticsResponseDto handle(UpdateAnalyticsReportCommand command) {
        // Find existing analytics report
        AnalyticsId analyticsId = AnalyticsId.of(command.getAnalyticsId());
        AnalyticsReport analyticsReport = analyticsReportRepository.findById(analyticsId)
            .orElseThrow(() -> new BusinessRuleViolationException("Analytics report not found: " + command.getAnalyticsId()));
        
        // Update description if provided
        if (command.getDescription() != null) {
            analyticsReport.updateDescription(command.getDescription());
        }
        
        // Update data if provided
        if (command.getData() != null) {
            analyticsReport.updateData(command.getData());
        }
        
        // Save updated analytics report
        AnalyticsReport savedReport = analyticsReportRepository.save(analyticsReport);
        
        // Return DTO
        return mapToDto(savedReport);
    }
    
    private AnalyticsResponseDto mapToDto(AnalyticsReport analyticsReport) {
        return AnalyticsResponseDto.builder(analyticsReport).build();
    }
}

