package io.delphiplatform.api.v3.rdb.service.amazon;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import io.delphiplatform.api.v3.model.datahealth.AmazonChartsDataHealthStatusReport;
import io.delphiplatform.api.v3.model.datahealth.AmazonDataHealthStatusSummary;
import io.delphiplatform.api.v3.rdb.entity.amazon.AmazonChartsDataHealthStatusSummaryProjection;
import io.delphiplatform.api.v3.rdb.repository.amazon.AmazonChartsDataStatusDailyRepository;
import io.delphiplatform.api.v3.view.util.Params;

@Service
@Transactional(readOnly = true)
public class AmazonChartsDataHealthStatusService {

    private final AmazonChartsDataStatusDailyRepository repository;

    @Autowired
    public AmazonChartsDataHealthStatusService(
        AmazonChartsDataStatusDailyRepository repository) {
        this.repository = repository;
    }

    public AmazonChartsDataHealthStatusReport<AmazonDataHealthStatusSummary> getAmzonChartsDataHealthStatus(
        Params params) {

        List<AmazonChartsDataHealthStatusSummaryProjection> items = repository.getStatusSummary(
            params.getDataHealthStatusesAsString(),
            params.getCountryCode()
        );

        AmazonChartsDataHealthStatusReport<AmazonDataHealthStatusSummary> report = new AmazonChartsDataHealthStatusReport<>();

        Map<String, AmazonDataHealthStatusSummary> dspMap = items.stream()
            .filter(elem -> elem.getChartType() == null && elem.getCountryCode() == null)
            .collect(Collectors.groupingBy(AmazonChartsDataHealthStatusSummaryProjection::getDsp, AmazonDataHealthSummaryCollector.get()));
        report.setDsp(dspMap);

        Map<String, Map<String, AmazonDataHealthStatusSummary>> breakdownChartTypeMap =
            items.stream().filter(elem -> elem.getChartType() != null && elem.getCountryCode() == null)
                .collect(Collectors.groupingBy(AmazonChartsDataHealthStatusSummaryProjection::getDsp,
                    Collectors.groupingBy(AmazonChartsDataHealthStatusSummaryProjection::getChartType, AmazonDataHealthSummaryCollector.get())));
        report.setBreakdownChartType(breakdownChartTypeMap);

        Map<String, Map<String, Map<String, AmazonDataHealthStatusSummary>>> dspChartTypeCountryMap =
            items.stream().filter(elem -> elem.getChartType() != null && elem.getCountryCode() != null)
                .collect(Collectors.groupingBy(AmazonChartsDataHealthStatusSummaryProjection::getDsp,
                    Collectors.groupingBy(AmazonChartsDataHealthStatusSummaryProjection::getChartType,
                        Collectors.groupingBy(AmazonChartsDataHealthStatusSummaryProjection::getCountryCode, AmazonDataHealthSummaryCollector.get()))));
        report.setDspChartTypeCountryCode(dspChartTypeCountryMap);

        return report;
    }
}