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

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.time.LocalDate;
import java.util.Collection;
import java.util.List;

import io.delphiplatform.api.v3.model.datahealth.DataCompleteness;
import io.delphiplatform.api.v3.rdb.entity.DataCompletenessEntity;
import io.delphiplatform.api.v3.rdb.entity.DataCompletenessId;

public interface DataCompletenessRepository extends JpaRepository<DataCompletenessEntity, DataCompletenessId> {

    @Query("SELECT new io.delphiplatform.api.v3.model.datahealth.DataCompleteness("
        + "dataCompleteness.dataCompletenessId.dsp.dspId, "
        + " MAX(dataCompleteness.reportDate)) "
        + " FROM data_completeness dataCompleteness "
        + " WHERE dataCompleteness.completenessStatus in ('COMPLETE', 'MIN_COMPLETE')"
        + " GROUP BY dataCompleteness.dataCompletenessId.dsp ")
    List<DataCompleteness> findDataCompleteness();

    @Query("SELECT new io.delphiplatform.api.v3.model.datahealth.DataCompleteness("
        + "dataCompleteness.dataCompletenessId.dsp.dspId, "
        + " MAX(dataCompleteness.reportDate)) "
        + " FROM data_completeness dataCompleteness "
        + " WHERE dataCompleteness.completenessStatus in ('COMPLETE', 'MIN_COMPLETE')"
        + " AND dataCompleteness.dataCompletenessId.dsp.dspId = :dspId"
        + " GROUP BY dataCompleteness.dataCompletenessId.dsp ")
    DataCompleteness findDataCompletenessByDsp(@Param("dspId") String dspId);

    @Query("SELECT new io.delphiplatform.api.v3.model.datahealth.DataCompleteness("
        + "dataCompleteness.dataCompletenessId.dsp.dspId, "
        + " MAX(dataCompleteness.reportDate)) "
        + " FROM data_completeness dataCompleteness "
        + " WHERE dataCompleteness.completenessStatus in ('COMPLETE', 'MIN_COMPLETE')"
        + " AND dataCompleteness.dataCompletenessId.dsp.dspId in (:dspIds)"
        + " AND dataCompleteness.reportDate <= :beforeDate"
        + " GROUP BY dataCompleteness.dataCompletenessId.dsp ")
    List<DataCompleteness> findDataCompletenessForDate(
        @Param("dspIds") Collection<String> dspIds,
        @Param("beforeDate") LocalDate beforeDate
    );
}
