package com.social.media.application.analytics.handler;

import com.social.media.application.analytics.command.CreateAnalyticsReportCommand;
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.company.valueobject.CompanyId;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * Handler for CreateAnalyticsReportCommand
 */
@Service
public class CreateAnalyticsReportCommandHandler {
    
    private final AnalyticsReportRepository analyticsReportRepository;
    
    public CreateAnalyticsReportCommandHandler(AnalyticsReportRepository analyticsReportRepository) {
        this.analyticsReportRepository = analyticsReportRepository;
    }
    
    @Transactional
    public AnalyticsResponseDto handle(CreateAnalyticsReportCommand command) {
        // Create new analytics report
        AnalyticsReport analyticsReport = new AnalyticsReport(
            CompanyId.of(Long.valueOf(command.getCompanyId())),
            command.getReportType(),
            command.getMetricType(),
            command.getPeriodStart(),
            command.getPeriodEnd(),
            command.getTitle(),
            command.getDescription()
        );
        
        // Add initial data if provided
        if (command.getInitialData() != null && !command.getInitialData().isEmpty()) {
            analyticsReport.updateData(command.getInitialData());
        }
        
        // Save analytics report
        AnalyticsReport savedReport = analyticsReportRepository.save(analyticsReport);
        
        // Return DTO
        return mapToDto(savedReport);
    }
    
    private AnalyticsResponseDto mapToDto(AnalyticsReport analyticsReport) {
        return AnalyticsResponseDto.builder(analyticsReport).build();
    }
}

