package es.uv.saic.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

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

import es.uv.saic.shared.domain.Usuari;
import es.uv.saic.shared.domain.UsuarisRol;
import es.uv.saic.shared.domain.UsuarisRolRepository;

@Service
public class UsuarisRolService {

	@Autowired
	private UsuarisRolRepository usuarisRolRepository;
	
	
	public List<UsuarisRol> findAll() {
		return this.usuarisRolRepository.findAll();
	}
	
	public boolean exists(String usuari, String tlugar, Integer lugar) {
		if(this.usuarisRolRepository.findActiveByUsuariTlugarLugar(usuari, tlugar, lugar) != null) {
			return true;
		}
		return false;
	}
	
	public UsuarisRol find(Integer idRol, String usuari, Integer lugar, String tlugar) {
		return this.usuarisRolRepository.find(idRol, usuari, lugar, tlugar);
	}
	
	public UsuarisRol findActive(Integer idRol, String usuari, Integer lugar, String tlugar) {
		return this.usuarisRolRepository.findActive(idRol, usuari, lugar, tlugar);
	}
	
	public UsuarisRol findLast(Integer idRol, String usuari, Integer lugar, String tlugar) {
		return this.usuarisRolRepository.findLast(idRol, usuari, lugar, tlugar);
	}
	
	public Integer findLastNum(Integer idRol, Integer lugar, String tlugar) {
		return this.usuarisRolRepository.findLastNum(idRol, lugar, tlugar);
	}
	
	public boolean hasActiveRol(Usuari usuari) {
		List<UsuarisRol> rols = this.usuarisRolRepository.findByUsernameActive(usuari);
		if(rols != null) {
			if(rols.size() > 0) {
				return true;
			}
		}
		return false;
	}
	
	public List<UsuarisRol> findActiveRols(Usuari usuari){
		return this.usuarisRolRepository.findByUsernameActive(usuari);
	}
	
	public boolean isGrantedUser(Usuari usuari) {
		if(this.usuarisRolRepository.findByUsernameActiveRol(usuari, "u_uq") != null || 
		   this.usuarisRolRepository.findByUsernameActiveRol(usuari, "u_admi") != null) {
			return true;
		}
		else {
			return false;
		}
	}
	
	public boolean isGrantedSupervisor(Usuari usuari) {
		if(this.usuarisRolRepository.findByUsernameActiveRol(usuari, "adeit") != null ||
		   this.usuarisRolRepository.findByUsernameActiveRol(usuari, "relint") != null ||
		   this.usuarisRolRepository.findByUsernameActiveRol(usuari, "u_supe") != null) {
			return true;
		}
		else {
			return false;
		}
	}
	
	public boolean isAdminUser(Usuari usuari) {
		if(this.usuarisRolRepository.findByUsernameActiveRol(usuari, "u_admi") != null) {
			return true;
		}
		else {
			return false;
		}
	}
	
	public boolean isDataTestUser(Usuari usuari) {
		if(this.usuarisRolRepository.findByUsernameActiveRol(usuari, "u_data") != null) {
			return true;
		}
		else {
			return false;
		}
	}
	
	public boolean hasActiveRol(Usuari usuari, String rol) {
		if(this.usuarisRolRepository.findByUsernameActiveRol(usuari, rol) != null) {
			return true;
		}
		else {
			return false;
		}
	}
	
	public boolean hasActiveRoles(Usuari usuari, ArrayList<String> rols) {
		if(this.usuarisRolRepository.findByUsernameActiveRoles(usuari, rols) != null) {
			return true;
		}
		else {
			return false;
		}
	}
	
	public boolean hasActiveAmbit(Usuari usuari, String ambit) {
		if(this.usuarisRolRepository.findByUsernameActiveAmbit(usuari.getUsuari(), ambit) != null) {
			return true;
		}
		else {
			return false;
		}
	}
	
	public boolean hasAssociatedProcs(String rol) {
		List<String> procs = this.usuarisRolRepository.findAssociatedProcs(rol);
		if(procs != null) {
			if(procs.size() > 0) {
				return true;
			}
			else {
				return false;
			}
		}
		else {
			return false;
		}
	}
	
	public List<String> findAssociatedProcs(String rol) {
		return this.usuarisRolRepository.findAssociatedProcs(rol);
	}
	
	public List<UsuarisRol> findManagerByCentre(Integer centre){
		return this.usuarisRolRepository.findManagerByCentre(centre);
	}
	
	public List<UsuarisRol> findManagerByTitulacio(Integer titulacio){
		return this.usuarisRolRepository.findManagerByTitulacio(titulacio);
	}
	
	public List<UsuarisRol> findManagerByCentres(List<Integer> centre){
		return this.usuarisRolRepository.findManagerByCentres(centre);
	}
	
	public List<UsuarisRol> findManagerByTitulacions(List<Integer> titulacio){
		return this.usuarisRolRepository.findManagerByTitulacions(titulacio);
	}
	
	public ArrayList<String> getSpecialRoles(){
		return new ArrayList<String>(Arrays.asList("adeit", "relint"));
	}
	
	public void save(UsuarisRol u) {
		this.usuarisRolRepository.save(u);
		this.usuarisRolRepository.flush();
	}
	
	public void delete(UsuarisRol ur) {
		this.usuarisRolRepository.delete(ur);
	}
	
	
}
