package io.delphiplatform.api.v3.rdb.service.apple.music;

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.AppleDataHealthStatusSummary;
import io.delphiplatform.api.v3.model.datahealth.ChartsDataHealthStatusReport;
import io.delphiplatform.api.v3.rdb.entity.apple.music.AppleMusicChartsDataHealthStatusSummaryProjection;
import io.delphiplatform.api.v3.rdb.repository.apple.music.AppleMusicChartsDataStatusDailyRepository;
import io.delphiplatform.api.v3.view.util.Params;

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

    private final AppleMusicChartsDataStatusDailyRepository repository;

    public AppleMusicChartsDataHealthStatusService(
        AppleMusicChartsDataStatusDailyRepository repository) {
        this.repository = repository;
    }

    public ChartsDataHealthStatusReport<AppleDataHealthStatusSummary> getAppleMusicChartsDataHealthStatus(Params params) {
        List<AppleMusicChartsDataHealthStatusSummaryProjection> items = repository.getStatusSummary(
            params.getDataHealthStatusesAsString(),
            params.getCountryCode()
        );

        ChartsDataHealthStatusReport<AppleDataHealthStatusSummary> report = new ChartsDataHealthStatusReport<>();

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

        Map<String, Map<String, AppleDataHealthStatusSummary>> dspChartTypeMap =
            items.stream().filter(elem -> elem.getChartType() != null && elem.getCountryCode() == null)
                .collect(Collectors.groupingBy(AppleMusicChartsDataHealthStatusSummaryProjection::getDsp,
                    Collectors.groupingBy(AppleMusicChartsDataHealthStatusSummaryProjection::getChartType,
                        AppleDataHealthSummaryCollector.get())));
        report.setDspChartType(dspChartTypeMap);

        Map<String, Map<String, Map<String, AppleDataHealthStatusSummary>>> dspChartTypeCountryMap =
            items.stream().filter(elem -> elem.getChartType() != null && elem.getCountryCode() != null)
                .collect(Collectors.groupingBy(AppleMusicChartsDataHealthStatusSummaryProjection::getDsp,
                    Collectors.groupingBy(AppleMusicChartsDataHealthStatusSummaryProjection::getChartType,
                        Collectors.groupingBy(AppleMusicChartsDataHealthStatusSummaryProjection::getCountryCode,
                            AppleDataHealthSummaryCollector.get()))));

        report.setDspChartTypeCountryCode(dspChartTypeCountryMap);

        return report;
    }
}
