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

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

import io.delphiplatform.api.v3.model.datahealth.AmazonDataHealthStatusSummary;
import io.delphiplatform.api.v3.rdb.entity.amazon.AmazonChartsDataHealthStatusSummaryProjection;

public class AmazonDataHealthSummaryCollector<T extends AmazonChartsDataHealthStatusSummaryProjection> {

    private AmazonDataHealthStatusSummary data;

    public AmazonDataHealthSummaryCollector() {
        this.data = new AmazonDataHealthStatusSummary();
    }

    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);
            }

        }

        LocalDateTime minDateTime = model.getMinDateTime();
        if (data.getMinDateTime() == null || minDateTime.isBefore(data.getMinDateTime())) {
            data.setMinDateTime(minDateTime);
        }

        LocalDateTime maxDateTime = model.getMaxDateTime();
        if (data.getMaxDateTime() == null || maxDateTime.isAfter(data.getMaxDateTime())) {
            data.setMaxDateTime(maxDateTime);
        }

        LocalDateTime validUntilDateTime = model.getValidUntilTime();
        if (validUntilDateTime!=null) {
            if (data.getValidUntilDateTime() == null || validUntilDateTime.isAfter(data.getValidUntilDateTime())) {
                data.setValidUntilDateTime(validUntilDateTime);
            }
        }
    }

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

    public AmazonDataHealthStatusSummary finish() {
        return data;
    }

    public static Collector<AmazonChartsDataHealthStatusSummaryProjection,
        AmazonDataHealthSummaryCollector<AmazonChartsDataHealthStatusSummaryProjection>,
        AmazonDataHealthStatusSummary> get() {
        return Collector.of(
            AmazonDataHealthSummaryCollector::new,
            AmazonDataHealthSummaryCollector::accumulate,
            AmazonDataHealthSummaryCollector::merge,
            AmazonDataHealthSummaryCollector::finish);
    }
}
