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

import java.time.OffsetDateTime;
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 org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ComponentDefinitionEntity;

@Repository
public interface ComponentDefinitionRepository extends JpaRepository<ComponentDefinitionEntity, String> {

    List<ComponentDefinitionEntity> findByDossierTemplateId(String dossierTemplateId);


    Optional<ComponentDefinitionEntity> findByIdAndDossierTemplateId(String componentId, String dossierTemplateId);


    @Query("SELECT c FROM ComponentDefinitionEntity c WHERE c.dossierTemplateId = :dossierTemplateId AND c.softDeleteTime IS NULL")
    List<ComponentDefinitionEntity> findByDossierTemplateIdAndSoftDeletedTimeIsNull(@Param("dossierTemplateId") String dossierTemplateId);


    @Modifying
    @Query("UPDATE ComponentDefinitionEntity c SET c.softDeleteTime = :softDeleteTime WHERE c.id IN :ids AND c.dossierTemplateId = :dossierTemplateId")
    void updateSoftDeleteForIds(@Param("ids") List<String> ids, @Param("dossierTemplateId") String dossierTemplateId, @Param("softDeleteTime") OffsetDateTime softDeleteTime);


    @Query("SELECT c FROM ComponentDefinitionEntity c WHERE c.id in :ids AND c.dossierTemplateId = :dossierTemplateId")
    List<ComponentDefinitionEntity> findByIdsAndDossierTemplateId(@Param("ids") List<String> ids, @Param("dossierTemplateId") String dossierTemplateId);


    @Query("SELECT COALESCE(MAX(c.rank), 0) from ComponentDefinitionEntity c WHERE c.dossierTemplateId = :dossierTemplateId AND c.softDeleteTime IS NULL")
    int maxRankByDossierTemplateId(@Param("dossierTemplateId") String dossierTemplateId);

    @Query("SELECT c.id FROM ComponentDefinitionEntity c WHERE c.dossierTemplateId = :dossierTemplateId AND c.technicalName = :technicalName AND c.softDeleteTime IS NOT NULL")
    Optional<String> findIdByDossierTemplateIdAndTechnicalNameAndIsSoftDeleted(@Param("dossierTemplateId") String dossierTemplateId, @Param("technicalName") String technicalName);


}
