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

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

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.dossier.DossierStatusEntity;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierStatusInfo;

public interface DossierStatusRepository extends JpaRepository<DossierStatusEntity, String> {

    @Query("select new com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierStatusInfo(s.id, s.name," + "s.description, s.dossierTemplateId, s.color, s.rank, count(d)) from DossierStatusEntity s " + "left outer join s.dossiers d where s.dossierTemplateId in (:dossierTemplateIds) group by s order by s.rank ASC")
    List<DossierStatusInfo> getAllDossierStatusForDossierTemplate(List<String> dossierTemplateIds);


    @Query("select new com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierStatusInfo(s.id, s.name," + "s.description, s.color, s.dossierTemplateId, s.rank, count(d)) from DossierStatusEntity s left outer join s.dossiers d where s.id = :dossierStatusId group by s")
    Optional<DossierStatusInfo> findProjectionById(String dossierStatusId);


    @Modifying
    @Query("update DossierStatusEntity d set d.rank = :newRank where d.id = :dossierStatusId")
    void updateRank(String dossierStatusId, int newRank);


    @Modifying
    @Query("update DossierStatusEntity d set d.rank = d.rank + 1 where d.dossierTemplateId = :dossierTemplateId and d.rank >= :rank")
    void adjustRanksForDossierTemplate(String dossierTemplateId, int rank);


    @Query("select count(d) from DossierStatusEntity d where d.dossierTemplateId = :dossierTemplateId and d.rank = :rankToCheck")
    int getDuplicateRanks(String dossierTemplateId, int rankToCheck);

}
