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

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

import io.delphiplatform.api.v3.model.datahealth.DataHealthStatusReport;
import io.delphiplatform.api.v3.model.datahealth.DataHealthStatusSummary;
import io.delphiplatform.api.v3.rdb.entity.DspDataHealthStatusSummaryProjection;
import io.delphiplatform.api.v3.rdb.repository.DspDataStatusDailyRepository;
import io.delphiplatform.api.v3.view.util.Params;

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

    private final DspDataStatusDailyRepository repository;
    private final BreakdownHelper breakdownHelper;

    public DataHealthStatusService(
        DspDataStatusDailyRepository repository,
        BreakdownHelper breakdownHelper) {
        this.repository = repository;
        this.breakdownHelper = breakdownHelper;
    }

    public DataHealthStatusReport getDataHealthStatusReport(Params params) {
        List<DspDataHealthStatusSummaryProjection> items = repository
            .getStatusSummary(params.getDataHealthStatusesAsString(), params.getDsp());

        DataHealthStatusReport report = new DataHealthStatusReport();
        report.setDspSegment(breakdownHelper.breakdown(items.stream(),
            DspDataHealthStatusSummaryProjection::getDsp,
            DspDataHealthStatusSummaryProjection::getDspSegment,
            (summary, reportItem) -> reportItem.populateWith(summary),
            DataHealthStatusSummary::new)
        );

        return report;
    }

}
