package com.rjconsultores.ventaboletos.dao.hibernate;

import java.util.List;

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

import com.rjconsultores.ventaboletos.dao.DispositivoEmbarcadaHistoricoDAO;
import com.rjconsultores.ventaboletos.entidad.DispositivoEmbarcadaHistorico;

@Repository("dispositivoEmbarcadaHistoricoDAO")
public class DispositivoEmbarcadaHistoricoHibernateDAO extends GenericHibernateDAO<DispositivoEmbarcadaHistorico, Long>
		implements DispositivoEmbarcadaHistoricoDAO {

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

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

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

		return c.list();
	}

	@Override
	@Transactional
	public DispositivoEmbarcadaHistorico suscribir(DispositivoEmbarcadaHistorico entity) {
		try {
			this.getHibernateTemplate().save(entity);
			getHibernateTemplate().flush();

			return entity;
		} catch (final HibernateException ex) {

			throw convertHibernateAccessException(ex);
		}
	}

	@Override
	public DispositivoEmbarcadaHistorico actualizacion(DispositivoEmbarcadaHistorico entity) {
		entity = getHibernateTemplate().merge(entity);
		getHibernateTemplate().flush();
		return entity;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<DispositivoEmbarcadaHistorico> buscarHistoricoDispositivoPorId(Long dispositivoId) {
		// Criteria c = getSession().createCriteria(getPersistentClass());
		// c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
		// c.add(Restrictions.eq("dispositivoEmbarcada.dispositivoEmbarcadaId", dispositivoId));
		// c.addOrder(Order.desc("dispositivoEmbarcadaHistId"));
		//
		// return (List<DispositivoEmbarcadaHistorico>)c.list();

		// Mantis 16258
		// Query acima continha muitos joins fetchs desnecessários a partir de EMPRESA, que foram criados de forma não explícita.
		// Assim a query retornava um número de registros além do real e não conseguia converter para a lista de DispositivoEmbarcadaHistorico
		final String hql = "select dh from DispositivoEmbarcadaHistorico dh join fetch dh.dispositivoEmbarcada de where de.dispositivoEmbarcadaId = :dispositivoEmbarcadaId order by dh.dispositivoEmbarcadaHistId";
		Query query = getSession().createQuery(hql);
		query.setParameter("dispositivoEmbarcadaId", dispositivoId);

		return query.list();
	}

}
