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

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.stream.Collector;

import io.delphiplatform.api.v3.model.datahealth.DataHealthStatusSummary;
import io.delphiplatform.api.v3.rdb.entity.CommonDataHealthStatusSummaryProjection;
import lombok.Getter;

@Getter
public class DataHealthSummaryCollector<T extends CommonDataHealthStatusSummaryProjection> {

    private DataHealthStatusSummary data;

    public DataHealthSummaryCollector() {
        this.data = new DataHealthStatusSummary();
    }

    public void accumulate(T model) {
        LocalDate minDate = model.getMinDate();
        if (data.getMinDate() == null || minDate.isBefore(data.getMinDate())) {
            data.setMinDate(minDate);
        }

        LocalDate maxDate = model.getMaxDate();
        if (data.getMaxDate() == null || maxDate.isAfter(data.getMaxDate())) {
            data.setMaxDate(maxDate);
        }

        LocalDate validUntilDate = model.getValidUntil();
        if (validUntilDate!=null) {
            if (data.getValidUntil() == null || validUntilDate.isAfter(data.getMaxDate())) {
                data.setValidUntil(validUntilDate);
            }

        }
        accumulateAdditionalDates(model);
    }

    protected void accumulateAdditionalDates(T model) {
    }

    public DataHealthSummaryCollector<T> merge(DataHealthSummaryCollector<T> another) {
        return this;
    }

    public DataHealthStatusSummary finish() {
        return data;
    }

    public static Collector<CommonDataHealthStatusSummaryProjection, DataHealthSummaryCollector,
        DataHealthStatusSummary> get() {
        return Collector.of(
            DataHealthSummaryCollector::new,
            DataHealthSummaryCollector::accumulate,
            DataHealthSummaryCollector::merge,
            DataHealthSummaryCollector::finish);
    }
}
