package com.rjconsultores.ventaboletos.dao.hibernate;

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
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.FeriadoDAO;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.entidad.Feriado;

@Repository("feriadoDAO")
public class FeriadoHibernateDAO extends GenericHibernateDAO<Feriado, Integer> implements FeriadoDAO {

	private static SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	
	@Autowired
	public FeriadoHibernateDAO(
			@Qualifier("sessionFactory") SessionFactory factory) {
		setSessionFactory(factory);
	}

	@Override
	public List<Feriado> obtenerTodos() {
		Criteria c = getSession().createCriteria(getPersistentClass());
		c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
		c.addOrder(Order.asc("id"));

		return c.list();
	}

	public List<Feriado> buscar(Date descferiado) {
		String hql = " select new com.rjconsultores.ventaboletos.entidad.Feriado(feriado.feriadoId, feriado.fecferiado,feriado.descferiado) from Feriado feriado" +
				" where feriado.activo = 1 and feriado.fecferiado =:data";

		Query sq = getSession().createQuery(hql);
		sq.setParameter("data", descferiado);
		List<Feriado> lsFeriado = sq.list();
		return lsFeriado;
	}

	@Override
	public boolean ehFeriado(Date fecFeriado, Empresa empresa, Estado estadoOrigem) {
			
		StringBuilder sb = new StringBuilder("");
		
		sb.append(" select count(*)                                                      ");
		sb.append(" from                                                                 ");
		sb.append(" 	Feriado f                                                        ");
		sb.append(" where                                                                ");
		sb.append(" 	f.activo = 1                                                     ");
		sb.append(" 	and f.fecferiado = TO_DATE(:fecFeriado,'dd/MM/yyyy')             ");
		sb.append(" 	and (f.estado is null or f.estado = :estado)          ");
		sb.append(" 	and (f.empresa is null or f.empresa = :empresa)      ");
		
		
		Query query = this.getSession().createQuery(sb.toString());
		query.setString("fecFeriado", sdf.format(fecFeriado));
		query.setParameter("estado",estadoOrigem);
		query.setParameter("empresa",empresa);
		
		return HibernateFix.count(query.uniqueResult()) > 0;
	}

	@Override
	public List<Feriado> buscarDataEmpresaEstado(Date data, Empresa empresa, Estado estado) {
		Criteria c = getSession().createCriteria(getPersistentClass());

		c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));

		c.add(Restrictions.eq("fecferiado", data));
		c.add(Restrictions.eq("estado", estado));
		c.add(Restrictions.eq("empresa", empresa));

		return c.list();
	}
}
