package com.social.media.application.analytics.handler;

import com.social.media.application.analytics.dto.AnalyticsResponseDto;
import com.social.media.application.analytics.query.GetRecentAnalyticsReportsQuery;
import com.social.media.domain.analytics.aggregate.AnalyticsReport;
import com.social.media.domain.analytics.repository.AnalyticsReportRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

/**
 * Handler for GetRecentAnalyticsReportsQuery
 */
@Service
@Transactional(readOnly = true)
public class GetRecentAnalyticsReportsQueryHandler {
    
    private final AnalyticsReportRepository analyticsReportRepository;
    
    public GetRecentAnalyticsReportsQueryHandler(AnalyticsReportRepository analyticsReportRepository) {
        this.analyticsReportRepository = analyticsReportRepository;
    }
    
    public List<AnalyticsResponseDto> handle(GetRecentAnalyticsReportsQuery query) {
        List<AnalyticsReport> analyticsReports;
        
        // Choose appropriate repository method based on filters
        if (query.getCompanyId() != null && query.getReportType() != null) {
            analyticsReports = analyticsReportRepository.findRecentReportsByCompanyAndType(
                query.getCompanyId(),
                query.getReportType(),
                query.getHoursThreshold(),
                query.getPage(),
                query.getSize()
            );
        } else if (query.getCompanyId() != null) {
            analyticsReports = analyticsReportRepository.findRecentReportsByCompany(
                query.getCompanyId(),
                query.getHoursThreshold(),
                query.getPage(),
                query.getSize()
            );
        } else {
            analyticsReports = analyticsReportRepository.findRecentReports(
                query.getHoursThreshold(),
                query.getPage(),
                query.getSize()
            );
        }
        
        // Convert to DTOs
        return analyticsReports.stream()
            .map(this::mapToDto)
            .collect(Collectors.toList());
    }
    
    private AnalyticsResponseDto mapToDto(AnalyticsReport analyticsReport) {
        return AnalyticsResponseDto.builder(analyticsReport).build();
    }
}

