package com.rjconsultores.ventaboletos.dao.hibernate;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import com.rjconsultores.ventaboletos.dao.OperadorEmbarcadaLinhaDAO;
import com.rjconsultores.ventaboletos.entidad.OperadorEmbarcada;
import com.rjconsultores.ventaboletos.entidad.OperadorEmbarcadaLinha;
import com.rjconsultores.ventaboletos.vo.ruta.RutaVO;

@Repository("operadorEmbarcadaLinhaDAO")
@SuppressWarnings("unchecked")
public class OperadorEmbarcadaLinhaHibernateDAO extends GenericHibernateDAO<OperadorEmbarcadaLinha, Long> implements OperadorEmbarcadaLinhaDAO {

	@Autowired
	public OperadorEmbarcadaLinhaHibernateDAO(@Qualifier("sessionFactory") SessionFactory factory) {
		setSessionFactory(factory);
	}
	
	@Override
	public List<OperadorEmbarcadaLinha> buscarPorOperador(OperadorEmbarcada operador) {
		Criteria c = getSession().createCriteria(getPersistentClass());
		c.add(Restrictions.eq("operadorEmbarcada", operador));		

		return c.list();
	}
	
	@Override
	public List<RutaVO> getListaRutaVO(Integer operador) {
		StringBuilder sb = new StringBuilder();
		sb.append(" SELECT ");
		sb.append(" new com.rjconsultores.ventaboletos.vo.ruta.RutaVO(RT.rutaId, RT.numRuta, RT.prefixo, RT.descruta, ORC.orgaoConcedenteId, ORC.descOrgao, ORC.indValDocObligatorioEmbarcada, RT.indSentidoIda, CLA.claseservicioId, CLA.descclase, RT.indTribTarifa, RT.indTribTaxaEmbarque, RT.indTribPedagio) ");
		sb.append(" FROM OperadorEmbarcadaLinha OPL ");
		sb.append(" INNER JOIN OPL.ruta RT ");
		sb.append(" INNER JOIN OPL.operadorEmbarcada OPE ");
		sb.append(" INNER JOIN RT.claseServicio CLA ");
		sb.append(" INNER JOIN RT.orgaoConcedente ORC ");
		sb.append("  WHERE ");
		sb.append("  OPE.usuario = :usuario_id ");
		sb.append("  AND OPL.activo = 1 AND RT.activo = 1 AND OPE.activo = 1 AND CLA.activo = 1 AND ORC.activo = 1 ");

		Query query = getSession().createQuery(sb.toString());
		query.setInteger("usuario_id", operador);
		
		List<RutaVO> rutas = (List<RutaVO>) query.list();
		return rutas;
	}
	
	@Override
	public List<Integer> getListaResumidaRutaVO(Integer operador) {
		StringBuilder sb = new StringBuilder();
		sb.append(" SELECT ");
		sb.append("  RT.rutaId ");
		sb.append(" FROM OperadorEmbarcadaLinha OPL ");
		sb.append(" INNER JOIN OPL.ruta RT ");
		sb.append(" INNER JOIN OPL.operadorEmbarcada OPE ");
		sb.append("  WHERE ");
		sb.append("  OPE.usuario = :usuario_id ");
		sb.append("  AND OPL.activo = 1 AND RT.activo = 1 AND OPE.activo = 1 ");
		
		Query query = getSession().createQuery(sb.toString());
		query.setInteger("usuario_id", operador);
		
		List<Integer> rutas = (List<Integer>) query.list();
		return rutas;
	}
	
}
