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

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

import java.time.LocalDate;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import io.delphiplatform.api.v3.model.datahealth.DataCompleteness;
import io.delphiplatform.api.v3.rdb.repository.DataCompletenessRepository;

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

    private final DataCompletenessRepository dataCompletenessRepository;

    @Autowired
    public DataCompletenessService(DataCompletenessRepository dataCompletenessRepository) {
        this.dataCompletenessRepository = dataCompletenessRepository;
    }

    @Transactional(readOnly = true)
    public List<DataCompleteness> getDataCompleteness() {
        return dataCompletenessRepository.findDataCompleteness();
    }

    @Transactional(readOnly = true)
    public DataCompleteness findDataCompletenessByDsp(String dspId) {
        return dataCompletenessRepository.findDataCompletenessByDsp(dspId);
    }

    /**
     * Returns date of most recent DSP data load that resulted in COMPLETE or MIN_COMPLETE. If no data is found for DSP before required date - map
     * won't contain that DSP id as key
     */
    @Transactional(readOnly = true)
    public Map<String, LocalDate> findLastCompletedUpdateDatePerDsp(
        Collection<String> dspIds,
        LocalDate beforeDate
    ) {
        return dataCompletenessRepository.findDataCompletenessForDate(dspIds, beforeDate)
            .stream()
            .filter(dc -> dc.getUpdatedDate() != null && dc.getUpdatedDate().isPresent())
            .collect(Collectors.toMap(DataCompleteness::getDsp,
                dc -> dc.getUpdatedDate().get()));
    }
}
