/*package com.dacrt.SBIABackend.repository;

import java.util.Optional;

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

import com.dacrt.SBIABackend.entity.Operationlines;
import com.dacrt.SBIABackend.entity.Riskevalfactors;
import com.dacrt.SBIABackend.entity.Riskevaluations;


	@Repository
	public interface RiskevalfactorsRepository extends JpaRepository<Riskevalfactors,Integer>,JpaSpecificationExecutor<Riskevalfactors>{

		boolean existsById(Integer id);
		Riskevalfactors getByRiskevaluationid(int id);
		Riskevalfactors getByRiskevaluationidAndRiskfactorid(int id,int riskfactorid);
		Riskevalfactors getById(int id);
		// Para el caso de borrar (ID < 0)
	    void deleteByRiskevaluationidAndRiskfactorid(Integer evalId, Integer rfId);
	    
	    // Para el caso de actualizar (ID > 0)
	    Optional<Riskevalfactors> findByRiskevaluationidAndRiskfactorid(Integer evalId, Integer rfId);
	 //   void deleteByRiskevaluationidAndRiskfactorid(Integer evalId, Integer rfId);
	    
	    
}*/

package com.dacrt.SBIABackend.repository;

import java.util.Optional;
import java.math.BigDecimal;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.stereotype.Repository;

import com.dacrt.SBIABackend.entity.Facilities;
import com.dacrt.SBIABackend.entity.Instrumentriskfactors;
import com.dacrt.SBIABackend.entity.Riskevalfactors;

@Repository
public interface RiskevalfactorsRepository extends JpaRepository<Riskevalfactors, Integer>, JpaSpecificationExecutor<Riskevalfactors> {

    // 1. Búsquedas Simples
   // Optional<Riskevalfactors> findByRiskevaluationid(Integer riskevaluationid);
    List<Riskevalfactors> findByRiskevaluationid(Integer riskevaluationid);
    Optional<Riskevalfactors> findById(int id);
    // 2. Búsqueda por ambos IDs (Para el caso ID > 0 - Actualizar)
    // Nota: Asegúrate de que en tu clase Entity el campo se llame exactamente 'riskevaluationid' y 'riskfactorid'
    Optional<Riskevalfactors> findByRiskevaluationidAndRiskfactorid(Integer riskevaluationid, Integer riskfactorid);
    
    @Modifying
    @Transactional
    void deleteByRiskevaluationid(Integer riskevaluationid);
    // 3. Borrado (Para el caso ID < 0)
    // IMPORTANTE: Sin @Modifying y @Transactional, el borrar fallará en tiempo de ejecución
    @Modifying
    @Transactional
    void deleteByRiskevaluationidAndRiskfactorid(Integer riskevaluationid, Integer riskfactorid);

    // 4. Otros métodos útiles
    boolean existsById(Integer id);
    
    @Query(" SELECT s from Riskevalfactors s where s.riskevaluationid = :riskevaluationid ")
    List<Riskevalfactors> findRiskevalfactors2(@Param("riskevaluationid") Integer riskevaluationid);
    @Transactional
	@Modifying
	//@Query(" UPDATE Strategiesdet e set e.resourceid=null,e.positionid=null,e.supplierid=null,e.facilityid=null,e.applicationid=null,e.channelid=null where e.id = ?1 ")
    @Query(" Update Riskevalfactors e set e.weight = ?1  where riskfactorid = ?2 ")
	void actualizarweigthfactors(BigDecimal peso,int id);
    
   /* @Transactional
	@Modifying
	//@Query(" DELETE FROM Riskevalfactors e where e.riskfactorid = ?1 ")
    @Query(" DELETE from main.riskevalfactors where riskfactorid = ?1 and  riskevaluationid in  (select id from main.riskevaluations where instrumentid = ?2 and status = 0)")
  	void deletebyfactorid(int riskfactorid,int idinstrumento);*/
    @Query(value = "SELECT riskevaluationid FROM main.riskevalfactors " +
            "WHERE riskfactorid = :viejoRiskFactor " +
            "AND riskevaluationid IN (SELECT id FROM main.riskevaluations WHERE instrumentid = :instrumentId AND status = 0)", 
    nativeQuery = true)
    List<Integer> findIdsToBackup(@Param("viejoRiskFactor") Integer viejoRiskFactor, 
    @Param("instrumentId") Integer instrumentId);

    @Modifying
    @Query(value = " DELETE FROM main.riskevalfactors WHERE riskfactorid = :factorId AND riskevaluationid IN (SELECT id FROM main.riskevaluations WHERE instrumentid = :instId)", nativeQuery = true)
    void deletebyfactorid(@Param("factorId") Integer factorId, @Param("instId") Integer instId);
    
    
}