package es.uv.saic.domain;


import java.util.ArrayList;
import java.util.List;

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


@Repository
public interface UsuarisRolRepository extends JpaRepository<UsuarisRol, Long> {

	@Query("SELECT i FROM UsuarisRol i WHERE i.usuari = ?1")
	List<UsuarisRol> findByUsername(String usuari);
	
	@Query("SELECT i FROM UsuarisRol i WHERE i.usuari = ?1 AND i.vigent = TRUE")
	List<UsuarisRol> findByUsernameActive(Usuari usuari);
	
	@Query("SELECT i FROM UsuarisRol i WHERE i.usuari = ?1 AND i.vigent = TRUE AND i.rol.nomRol = ?2")
	UsuarisRol findByUsernameActiveRol(Usuari usuari, String Rol);
	
	@Query("SELECT i FROM UsuarisRol i WHERE i.usuari = ?1 AND i.vigent = TRUE AND i.rol.nomRol IN(?2)")
	UsuarisRol findByUsernameActiveRoles(Usuari usuari, ArrayList<String> Rol);
	
	@Query(value=("SELECT * FROM usuaris_rols WHERE usuari = ?1 AND tlugar = ?2 AND lugar = ?3 AND vigent LIMIT 1"), nativeQuery=true)
	UsuarisRol findActiveByUsuariTlugarLugar(String usuari, String tlugar, Integer lugar);
	
	//@Query("SELECT i FROM UsuarisRol i WHERE i.usuari = ?1 AND i.vigent = TRUE AND i.rol.ambit = ?2 LIMIT 1")
	@Query(value=("SELECT ur.* "
			+ "FROM usuaris_rols ur LEFT JOIN rols r ON ur.id_rol = r.id_rol "
			+ "WHERE ur.usuari = ?1 AND r.ambit = ?2 AND ur.vigent LIMIT 1"), nativeQuery=true)
	UsuarisRol findByUsernameActiveAmbit(String usuari, String ambit);
	
	@Query(value=("SELECT nom_proces FROM processos_rols WHERE id_rol IN(SELECT id_rol FROM rols WHERE nom_rol = ?1)"), nativeQuery=true)
	List<String> findAssociatedProcs(String rol);

	@Query(value=("SELECT * FROM usuaris_rols WHERE tlugar = 'C' AND lugar = ?1 AND vigent ORDER BY id_rol ASC"), nativeQuery=true)
	List<UsuarisRol> findManagerByCentre(Integer centre);
	
	@Query(value=("SELECT * FROM usuaris_rols WHERE tlugar = 'T' AND lugar = ?1 AND vigent ORDER BY lugar"), nativeQuery=true)
	List<UsuarisRol> findManagerByTitulacio(Integer titulacio);
	
	@Query(value=("SELECT * FROM usuaris_rols WHERE tlugar = 'C' AND lugar IN(?1) AND vigent ORDER BY id_rol ASC"), nativeQuery=true)
	List<UsuarisRol> findManagerByCentres(List<Integer> centre);
	
	@Query(value=("SELECT * FROM usuaris_rols WHERE tlugar = 'T' AND lugar IN(?1) AND vigent ORDER BY lugar"), nativeQuery=true)
	List<UsuarisRol> findManagerByTitulacions(List<Integer> titulacio);
	
	@Query(value=("SELECT * FROM usuaris_rols WHERE id_rol = ?1 AND usuari = ?2 AND lugar = ?3 AND tlugar = ?4"), nativeQuery=true)
	UsuarisRol find(Integer idRol, String usuari, Integer lugar, String tlugar);
	
	@Query(value=("SELECT * FROM usuaris_rols WHERE id_rol = ?1 AND usuari = ?2 AND lugar = ?3 AND tlugar = ?4 AND vigent"), nativeQuery=true)
	UsuarisRol findActive(Integer idRol, String usuari, Integer lugar, String tlugar);
	
	@Query(value=("SELECT * FROM usuaris_rols WHERE id_rol = ?1 AND usuari = ?2 AND lugar = ?3 AND tlugar = ?4 ORDER BY num DESC LIMIT 1"), nativeQuery=true)
	UsuarisRol findLast(Integer idRol, String usuari, Integer lugar, String tlugar);
	
	@Query(value=("SELECT num FROM usuaris_rols WHERE id_rol = ?1 AND lugar = ?2 AND tlugar = ?3 ORDER BY num DESC LIMIT 1"), nativeQuery=true)
	Integer findLastNum(Integer idRol, Integer lugar, String tlugar);
	
	
}
