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

import com.rjconsultores.ventaboletos.dao.CorridaCtrlDAO;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.CorridaCtrl;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import java.util.Date;
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;

/**
 * 
 * @author Administrador
 */
@Repository("corridaCtrlDAO")
public class CorridaCtrlHibernateDAO extends GenericHibernateDAO<CorridaCtrl, Integer>
		implements CorridaCtrlDAO {

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

	public CorridaCtrl buscar(Ruta ruta, ClaseServicio claseServicio, Marca marca,
			Date horario, boolean isPisoExtra) {
		Criteria c = getSession().createCriteria(getPersistentClass());
		c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
		c.add(Restrictions.eq("marca", marca));
		c.add(Restrictions.eq("claseServicio", claseServicio));
		c.add(Restrictions.eq("ruta", ruta));
		c.add(Restrictions.eq("horario", horario));

		if (isPisoExtra) {
			// CorridaCtrl para Piso Extra
			c.add(Restrictions.eq("pisoExtra", true));
		} else {
			// num piso == null ou false
			c.add(Restrictions.or(Restrictions.not(Restrictions.eq("pisoExtra", true)), Restrictions.isNull("pisoExtra")));
		}

		List<CorridaCtrl> lsCorridaCtrl = c.list();

		if ((lsCorridaCtrl == null) || (lsCorridaCtrl.isEmpty())) {
			return null;
		} else {
			return lsCorridaCtrl.get(0);
		}
	}

	@Override
	public CorridaCtrl buscar(Integer corridaId, Parada origem, Parada destino, ClaseServicio claseServicio, Marca marca) {
		StringBuilder hql = new StringBuilder();
		hql.append(" SELECT cc ");
		hql.append(" FROM CorridaCtrl cc ");
		hql.append(" INNER JOIN cc.ruta.rutaCombinacionList AS rutaCombinacionList ");
		hql.append(" INNER JOIN rutaCombinacionList.tramo AS tramo");
		hql.append(" WHERE cc.activo = true ");
		hql.append("    AND cc.corridaId = :corridaId ");
		hql.append("  	AND cc.marca.marcaId = :marcaId ");
		hql.append("  	AND cc.claseServicio = :claseservicioId ");
		hql.append("  	AND tramo.activo = true ");
		hql.append("  	AND tramo.origem.paradaId = :paradaOrigemId ");
		hql.append("  	AND tramo.destino.paradaId = :paradaDestinoId ");
		hql.append("    AND rutaCombinacionList.activo = true ");

		Query sq = getSession().createQuery(hql.toString());
		sq.setInteger("corridaId", corridaId);
		sq.setInteger("marcaId", marca.getMarcaId());
		sq.setInteger("claseservicioId", claseServicio.getClaseservicioId());
		sq.setInteger("paradaOrigemId", origem.getParadaId());
		sq.setInteger("paradaDestinoId", destino.getParadaId());

		return (CorridaCtrl) sq.uniqueResult();
	}
}
