package es.uv.saic.service;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

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

import es.uv.saic.domain.EvidenciaIndicadorEnquesta;
import es.uv.saic.domain.EvidenciaIndicadorEnquestaRepository;
import es.uv.saic.domain.IndicadorEnquesta;
import es.uv.saic.domain.IndicadorEnquestaRepository;
import es.uv.saic.domain.Organ;
import es.uv.saic.dto.IndicadorDTO;
import es.uv.saic.dto.IndicadorEnquestaValorDTO;
import es.uv.saic.dto.OrganDTO;

@Service
public class IndicadorEnquestaService {

	@Autowired
	private IndicadorEnquestaRepository r;
	@Autowired
	private EvidenciaIndicadorEnquestaRepository rie;
	
	
	public List<IndicadorEnquesta> findAll() {
		return this.r.findAll();
	}
	
	public List<String> findTypes(){
		return this.r.findTypes();
	}
	
	public List<IndicadorEnquesta> findByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi) {
		return this.r.findByEnquestaCursAmbitEstudi(enquesta, curs, ambit, estudi);
	}
	
	public List<IndicadorEnquesta> findByEnquestaCursAmbitEstudiCentre(String enquesta, Integer curs, String ambit, String estudi, Integer centre) {
		return this.r.findByEnquestaCursAmbitEstudiCentre(enquesta, curs, ambit, estudi, centre);
	}
	
	public List<IndicadorEnquesta> findByEnquestaCursAmbitEstudiCentreTitulacio(String enquesta, Integer curs, String ambit, String estudi, Integer centre, Integer titulacio) {
		return this.r.findByEnquestaCursAmbitEstudiCentreTitulacio(enquesta, curs, ambit, estudi, centre, titulacio);
	}
	
	public List<IndicadorEnquestaValorDTO> getAssociatedInds(String evidencia, String proces, Integer titulacio, Integer centre, Integer curs){
		return this.r.getAssociatedInds(evidencia, proces, titulacio, centre, curs);
	}
	
	public List<IndicadorEnquestaValorDTO> getAllInds(Integer titulacio, Integer centre, Integer curs){
		//String estudi = titulacio < 2000 ? "G" : "M";
		//estudi = titulacio == 2 ? "M" : estudi;
		
		String estudi = "G";
		/*  TODO replace with tambit  */
		if(titulacio == 1) {
			estudi = "G";
		}
		else if(titulacio == 2) {
			estudi = "M";
		}
		else if(titulacio >= 1000 & titulacio < 2000) {
			estudi = "G";
		}
		else if(titulacio >= 2000 & titulacio < 3000) {
			estudi = "M";
		}
		else if(titulacio >= 3000) {
			estudi = "D";
		}	

		if(titulacio == 0) {
			return  Stream.concat(this.r.getAllIndValsByEstudi(titulacio, centre, curs, "G").stream(), 
					              this.r.getAllIndValsByEstudi(titulacio, centre, curs, "M").stream())
                    .collect(Collectors.toList());
		}
		return this.r.getAllIndValsByEstudi(titulacio, centre, curs, estudi);
	}
	
	public List<IndicadorEnquesta> getAllInds(Organ o, Integer curs){
		return this.r.getAllIndsByEstudi(o.getId().getLugar(), o.getOrgan().getId().getLugar(), curs, o.getTambit());
	}

	public List<IndicadorEnquesta> getAllInds(OrganDTO o, Integer curs){
		return this.r.getAllIndsByEstudi(o.getLugar(), o.getLugar2(), curs, o.getTambit());
	}
			
	public List<IndicadorDTO> getGraphData(List<Integer> titulacions, Integer centre, String estudi, Integer cursMax) {
		return this.r.getGraphData(titulacions, centre, estudi, cursMax);
	}
	
	public List<IndicadorDTO> getGraphData(Integer centre, String estudi, Integer cursMax) {
		return this.r.getGraphData(centre, estudi, cursMax);
	}
		
	public boolean contains(String evidencia, String proces, String enquesta) {
		List<EvidenciaIndicadorEnquesta> inds = this.rie.getIndicadors(proces, evidencia, enquesta);
		if(inds.size() > 0) {
			return true;
		}
		return false;
	}
	
	public int deleteCentroNoAdscrito() {
		return this.r.deleteCentroNoAdscrito();
	}
	
	public int deleteByEnquesta(String enquesta) {
		return this.r.deleteByEnquesta(enquesta);
	}
	
	public int deleteByEnquestaCurs(String enquesta, Integer curs) {
		return this.r.deleteByEnquestaCurs(enquesta, curs);
	}
	
	public int fixBiennials(String enquesta, Integer curs) {
		return this.r.fixBiennials(enquesta, curs);
	}
	
	public Integer consolidateByEnquesta(String enquesta) {
		return this.r.consolidateByEnquesta(enquesta);
	}
	
	public void deleteAll() {
		this.r.deleteAll();
		this.r.flush();
	}
	
	public void save(IndicadorEnquesta x) {
		this.r.save(x);
		this.r.flush();
	}
	
	public void saveAll(List<IndicadorEnquesta> l) {
		this.r.saveAll(l);
		this.r.flush();
	}
	
}
