package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository;

import java.util.List;
import java.util.Optional;
import java.util.Set;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionarySummaryResponse;

public interface TypeRepository extends JpaRepository<TypeEntity, String> {

    @Query("select t from TypeEntity t where t.dossierTemplateId = :dossierTemplate and t.dossierId = :dossier and t.rank = :rank  and t.softDeletedTime is null")
    Optional<TypeEntity> findOneByDossierTemplateIdAndDossierIdAndRank(String dossierTemplate, String dossier, int rank);


    List<TypeEntity> findByDossierId(String dossierId);


    @Query("select t from TypeEntity t where t.id = :typeId and t.softDeletedTime is null")
    Optional<TypeEntity> findByIdAndNotDeleted(String typeId);


    @Modifying
    @Query("update TypeEntity t set t.version = t.version +1 where t.id = :typeId")
    void updateByIdSetIncrementVersionByOne(String typeId);

    @Query("select t from TypeEntity t where t.dossierTemplateId = :dossierTemplateId and t.type = :type and t.dossierId is not null")
    List<TypeEntity> getAllDossierTypesForDossierTemplateAndType(String dossierTemplateId, String type);

    @Query("select t from TypeEntity t where t.dossierTemplateId = :dossierTemplateId and t.dossierId is null")
    List<TypeEntity> getAllTypesForDossierTemplate(String dossierTemplateId);


    @Query("select t from TypeEntity t where t.dossierTemplateId = :dossierTemplateId or t.dossierId = :dossierId")
    List<TypeEntity> findAllTypesByDossierTemplateIdOrDossierId(String dossierTemplateId, String dossierId);


    List<TypeEntity> findAllByDossierTemplateIdAndDossierId(String dossierTemplateId, String dossierId);


    @Query("select coalesce(sum(t.version),0) from TypeEntity t where t.dossierId = :dossierId")
    long getVersionForDossierId(String dossierId);


    @Query("select coalesce(sum(t.version),0) from TypeEntity t where t.dossierTemplateId = :dossierTemplateId and t.dossierId is null")
    long getVersionForDossierTemplateId(String dossierTemplateId);


    @Query("""
            select new com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionarySummaryResponse(dt.id, t.id, t.type, t.label, count(e))
            from DossierTemplateEntity dt
            left join TypeEntity t on t.dossierTemplateId = dt.id
            left join DictionaryEntryEntity e on e.typeId = t.id
            where t.softDeletedTime is null and dt.id in :dossierTemplateIds and t.dossierId is null and (e.entryId is null or e.deleted = false)
            group by dt.id, t.id, t.type, t.label""")
    List<DictionarySummaryResponse> findDictionarySummaryList(Set<String> dossierTemplateIds);


    @Modifying(clearAutomatically = true, flushAutomatically = true)
    @Query("Update TypeEntity t set t.softDeletedTime = offset_datetime where t.id = :typeId")
    void softDeleteTypeById(String typeId);


    @Modifying
    @Query("Update TypeEntity t set t.softDeletedTime = null where t.id = :typeId and t.softDeletedTime is not null")
    int unSoftDeleteTypeById(String typeId);

}
