/*
 * 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.TramoTiempoDAO;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Tramo;
import com.rjconsultores.ventaboletos.entidad.TramoTiempo;
import com.rjconsultores.ventaboletos.entidad.Via;
import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;

import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
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("tramoTiempoDAO")
public class TramoTiempoHibernateDAO extends GenericHibernateDAO<TramoTiempo, Integer> implements TramoTiempoDAO {

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

	@Override
	public List<TramoTiempo> obtenerTodos() {
		Criteria c = getSession().createCriteria(getPersistentClass());
		c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));

		return c.list();
	}

	public List<TramoTiempo> buscarPorTramo(Tramo tramo) {
		Criteria c = getSession().createCriteria(getPersistentClass());
		c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
		c.add(Restrictions.eq("tramo", tramo));

		return c.list();
	}

	public List<TramoTiempo> buscarPorTramo(Tramo tramo, ClaseServicio clase) {
		Criteria c = getSession().createCriteria(getPersistentClass());
		c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
		c.add(Restrictions.eq("tramo", tramo));
		c.add(Restrictions.eq("claseServicio", clase));

		return c.list();
	}

	@Override
	public List<TramoTiempo> buscar(Tramo tramo, ClaseServicio clase, Date horaIni, Date horaFin) {

		Criteria c = this.makeCriteria();
		c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
		c.add(Restrictions.eq("tramo", tramo));
		c.add(Restrictions.eq("claseServicio", clase));
		
		Calendar tmpIni = Calendar.getInstance();
		tmpIni.setTime(horaIni);
		
		Calendar tmpFin = Calendar.getInstance();
		tmpFin.setTime(horaFin);
		
		Calendar fecInicio = DateUtil.getFecInicio();
		fecInicio.set(Calendar.HOUR_OF_DAY, tmpIni.get(Calendar.HOUR_OF_DAY));
		fecInicio.set(Calendar.MINUTE, tmpIni.get(Calendar.MINUTE));
		
		Calendar fecFin = DateUtil.getFecInicio();
		fecFin.set(Calendar.HOUR_OF_DAY, tmpFin.get(Calendar.HOUR_OF_DAY));
		fecFin.set(Calendar.MINUTE, tmpFin.get(Calendar.MINUTE));
		
		if (fecFin.compareTo(fecInicio) < 0){// se a data fin é menor que a data inicio (considerando a hora), é porque é no dia seguinte. Ex.: Intervalo 23:00 e 00:00
			fecFin.add(Calendar.DATE, 1);
		}

		c.add(Restrictions.ge("horafin",fecInicio.getTime()));
		c.add(Restrictions.le("horainicio",fecFin.getTime()));
		
		return c.list();
	}

}
