package com.dacrt.SBIABackend.repository;


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

import javax.transaction.Transactional;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.stereotype.Repository;

import com.dacrt.SBIABackend.dto.UnitsDtoStatus;
import com.dacrt.SBIABackend.entity.Unitprocesses;
import com.dacrt.SBIABackend.entity.Units;
import com.dacrt.SBIABackend.entity.Userunits;

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


//import com.dacrt.SBIABackend.security.dto.ParamsDto;
import com.dacrt.SBIABackend.security.entity.Params;
import com.dacrt.SBIABackend.security.entity.Users;

@Repository
public interface UnitprocessesRepository extends JpaRepository<Unitprocesses,Integer>,JpaSpecificationExecutor<Unitprocesses>{
	
	
	@Query("SELECT count(c) FROM Unitprocesses c")
	long countRegUnits();
	
	//Unitprocesses findByUnidit(int id);	 
	
	List<Unitprocesses> findByUnitid(int unitid);
	Unitprocesses findByUnitidAndProcessid(int unitid,int processid);
	boolean existsByUnitidAndProcessid(int unitid,int processid);
	//findByNameAndApellido
	//List<Userunits> findByUserid(int userid);
    //Optional<Userunits> findById(int id);
	
	//List<Userunits> findByUserid(int userid);
	
	@Transactional
	@Modifying
	@Query(" DELETE FROM Unitprocesses e where e.unitid = ?1 ")
	void borrarUnitsProcesses(int idunit);
	
	boolean existsByProcessid(int processid);
	
	@Transactional
	@Modifying
	@Query(" DELETE FROM Unitprocesses pc where pc.processid = ?1 ")
	void borrarProcessesUnits(int processid);
	
	@Query(" SELECT up.processid from Unitprocesses up WHERE up.unitid = ?1 and up.processid NOT IN ?2" )
	List<Integer> findIdProcDelete(int unitid,List<Integer> procesos);
	
	@Query(" SELECT up.processid from Unitprocesses up WHERE up.unitid = ?1 and up.processid IN ?2" )
	List<Integer> findIdProcNew(int unitid,List<Integer> procesos);
	
	@Query(" SELECT count(1) from Unitprocesses up WHERE up.unitid = ?1 and up.processid = ?2 AND up.deleted is not null" )
	Integer findProceEliminado(int unitid,int processid);
	
	//select * from main.unitprocesses where unitid = 2 and processid  not in (1,2,3,4) 
	// TODO ESTO ES NUEVO PARA TRATAR DE SOLVENTAR TEMAS DE IDDLE O PROCESOS FANTASMAS QUE NO CIERRAN LA CONEXION A LA BD
   /* @Query("SELECT up.processid FROM Unitprocesses up WHERE up.unitid = :unitId AND up.processid NOT IN :processIds AND up.deleted IS NULL")
    List<Integer> findIdsToExclude(@Param("unitId") Integer unitId, @Param("processIds") List<Integer> processIds);

    Optional<Unitprocesses> findByUnitidAndProcessid(Integer unitId, Integer processId);
    
    @Modifying
    @Query("DELETE FROM Unitprocesses up WHERE up.unitid = :unitId AND up.processid = :processId")
    void hardDelete(@Param("unitId") Integer unitId, @Param("processId") Integer processId);*/
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
