/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.dao.hibernate;

import java.util.Calendar;
import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
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 org.springframework.transaction.annotation.Transactional;

import com.rjconsultores.ventaboletos.dao.ConexionRutaLocalidadeRemovidaDAO;
import com.rjconsultores.ventaboletos.entidad.ConexionRutaLocalidadeRemovida;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

/**
 *
 * @author valdevirsp
 */
@Repository("conexionRutaLocalidadeRemovidaDAO")
public class ConexionRutaLocalidadeRemovidaHibernateDAO extends GenericHibernateDAO<ConexionRutaLocalidadeRemovida, Integer> implements ConexionRutaLocalidadeRemovidaDAO {

	private static Logger log = LogManager.getLogger(ConexionRutaLocalidadeRemovidaHibernateDAO.class);

	@Autowired
	public ConexionRutaLocalidadeRemovidaHibernateDAO(@Qualifier("sessionFactory") SessionFactory factory) {
		setSessionFactory(factory);
	}

	@Override
	public void removerPorParada(Parada parada) {
		try {
			Criteria c = this.makeCriteria();
			c.add(Restrictions.eq("paradaId", parada.getParadaId().longValue()));
			c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
			ConexionRutaLocalidadeRemovida conexionRutaLocalidadeRemovida = (ConexionRutaLocalidadeRemovida) c.uniqueResult();
			borrar(conexionRutaLocalidadeRemovida);
		} catch (Exception e) {
			log.error("Erro ao remover por por paradaId", e);
		}

	}
	
	@Override
	public void removerPorConexionrutaconfIdePorParada(Integer conexionrutaconfId,Parada parada) {
		try {
			Criteria c = this.makeCriteria();
			c.add(Restrictions.eq("conexionrutaconfId", conexionrutaconfId));
			c.add(Restrictions.eq("paradaId", parada.getParadaId().longValue()));
			c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
			List<ConexionRutaLocalidadeRemovida> conexionRutaLocalidadeRemovidaList = c.list();
			ConexionRutaLocalidadeRemovida conexionRutaLocalidadeRemovida =conexionRutaLocalidadeRemovidaList != null && conexionRutaLocalidadeRemovidaList.size() > 0 ? conexionRutaLocalidadeRemovidaList.get(0) : null;
			if(conexionRutaLocalidadeRemovida != null) {
				borrar(conexionRutaLocalidadeRemovida);
			}
			
		} catch (Exception e) {
			log.error("Erro ao remover por por paradaId", e);
		}

	}

	@Transactional
	public void borrar(ConexionRutaLocalidadeRemovida entidad) {
		try {
			entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			entidad.setFecmodif(Calendar.getInstance().getTime());
			entidad.setActivo(Boolean.FALSE);
			actualizacion(entidad);
		} catch (Exception e) {
			log.error("Erro ao borrar conexionRutaLocalidadeRemovida ", e);
		}
	}

	@SuppressWarnings("unchecked")
	public ConexionRutaLocalidadeRemovida obtenerPorParadaId(Integer paradaId) {
		try {
			Criteria c = this.makeCriteria();
			c.add(Restrictions.eq("paradaId", paradaId));
			c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
			List<ConexionRutaLocalidadeRemovida> conexionRutaLocalidadeRemovidaList = c.list();
			return conexionRutaLocalidadeRemovidaList != null && conexionRutaLocalidadeRemovidaList.size() > 0 ? conexionRutaLocalidadeRemovidaList.get(0) : null;
		} catch (Exception e) {
			log.error("Erro ao obter paradas por por paradaId", e);
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<ConexionRutaLocalidadeRemovida> obtenerPorParadaIdList(List<Long> paradaIdList) {
		try {
			Criteria c = this.makeCriteria();
			c.add(Restrictions.in("paradaId", paradaIdList));
			c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
			List<ConexionRutaLocalidadeRemovida> conexionRutaLocalidadeRemovidaList = c.list();
			return conexionRutaLocalidadeRemovidaList;
		} catch (Exception e) {
			log.error("Erro ao obter paradas por por paradaIdList", e);
			return null;
		}

	}

	@Override
	public ConexionRutaLocalidadeRemovida obtenerPorParadaIdEConexionrutaconfId(Integer conexionRutaConfId,
			Integer paradaId) {
		// TODO Auto-generated method stub
		try {
			Criteria c = this.makeCriteria();
			c.add(Restrictions.eq("conexionRutaConfId", conexionRutaConfId));
			c.add(Restrictions.eq("paradaId", paradaId));
			c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
			List<ConexionRutaLocalidadeRemovida> conexionRutaLocalidadeRemovidaList = c.list();
			return conexionRutaLocalidadeRemovidaList != null && conexionRutaLocalidadeRemovidaList.size() > 0 ? conexionRutaLocalidadeRemovidaList.get(0) : null;
		} catch (Exception e) {
			log.error("Erro ao obter paradas por conexionRutaConfId e por paradaId", e);
			return null;
		}
	}

	@Override
	public List<ConexionRutaLocalidadeRemovida> obtenerPorConexionrutaconfIdEParadaIdList(Integer conexionRutaConfId,List<Long> paradaIdList) {
		try {
			Criteria c = this.makeCriteria();
			c.add(Restrictions.eq("conexionRutaConfId", conexionRutaConfId));
			c.add(Restrictions.in("paradaId", paradaIdList));
			c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
			List<ConexionRutaLocalidadeRemovida> conexionRutaLocalidadeRemovidaList = c.list();
			return conexionRutaLocalidadeRemovidaList;
		} catch (Exception e) {
			log.error("Erro ao obter paradas  por conexionRutaConfId e  paradaIdList", e);
			return null;
		}
	}
	
	@Override
	public void removerTodosPorConexionrutaconfId(Integer conexionRutaConfId) {
		StringBuilder hql = new StringBuilder();
		hql.append("delete CONEXION_RUTA_LOC_REMOVIDA ");
		hql.append("where  CONEXIONRUTACONF_ID=:conexionRutaConfId ");
		Query query = getSession().createSQLQuery(hql.toString());
		query.setInteger("conexionRutaConfId", conexionRutaConfId);
		query.executeUpdate();
	}
}
