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.Query;
import org.hibernate.SessionFactory;
import org.hibernate.transform.Transformers;
import org.hibernate.type.BooleanType;
import org.hibernate.type.LongType;
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.EmbarcadaDispOperadorDAO;
import com.rjconsultores.ventaboletos.entidad.EmbarcadaDispOperador;

@Repository("embarcadaDispOperadorDAO")
public class EmbarcadaDispOperadorHibernateDAO extends GenericHibernateDAO<EmbarcadaDispOperador, Long>
		implements EmbarcadaDispOperadorDAO {
	private static final Logger log = LogManager.getLogger(EmbarcadaDispOperadorHibernateDAO.class);

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

	@SuppressWarnings("unchecked")
	@Override
	public List<EmbarcadaDispOperador> buscarEmbarcadaDispOperadorPorPuntoVenta(Long puntoVentaId) {
		StringBuilder sQuery = new StringBuilder();
		sQuery.append("select EMBARCADADISPOPERADOR_ID as embarcadaDispOperador, ")
				.append(" DISPOSITIVOEMBARCADA_ID as dispositivoEmbarcadaId, ")
				.append(" USUARIO_ID as usuarioId, ")
				.append(" PUNTOVENTA_ID as puntoVentaId, ")
				.append(" ACTIVO as activo ")
				.append(" from embarcada_disp_operador embdispop ")
				.append(" where  ")
				.append(" embdispop.puntoventa_id = :puntoVentaId ")
				.append(" and embdispop.activo = 1 ");
		Query qr = getSession().createSQLQuery(sQuery.toString())
				.addScalar("embarcadaDispOperador", new LongType())
				.addScalar("dispositivoEmbarcadaId", new LongType())
				.addScalar("usuarioId", new LongType())
				.addScalar("puntoVentaId", new LongType())
				.addScalar("activo", new BooleanType())
				.setResultTransformer(Transformers.aliasToBean(EmbarcadaDispOperador.class));

		qr.setLong("puntoVentaId", puntoVentaId);
		return (List<EmbarcadaDispOperador>) qr.list();
	}

	@Transactional
	@Override
	public boolean removerListEmbarcadaDispOperador(List<EmbarcadaDispOperador> embarcadaDisOperadorList) {
		try {
			for (EmbarcadaDispOperador embarcadaDispOperador : embarcadaDisOperadorList) {
				StringBuilder sQuery = new StringBuilder();
				sQuery.append("delete  ")
						.append(" from embarcada_disp_operador embdispop ")
						.append(" where  ")
						.append(" embdispop.usuario_id = :usuarioId ")
						.append(" and embdispop.dispositivoembarcada_id = :dispositivoEmbarcadaId ")
						.append(" and embdispop.activo = 1 ");
				Query qr = getSession().createSQLQuery(sQuery.toString());
				qr.setLong("usuarioId", embarcadaDispOperador.getUsuarioId());
				qr.setLong("dispositivoEmbarcadaId", embarcadaDispOperador.getDispositivoEmbarcadaId());
				qr.executeUpdate();

			}
		} catch (Exception e) {
			log.error("Erro ao deletar dispositivos usuários");
			return false;
		}
		return true;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<EmbarcadaDispOperador> buscarEmbarcadaDispOperadorPorDispositivo(Long dispositivoEmbarcadaId) {
		StringBuilder sQuery = new StringBuilder();
		sQuery.append("select embdispop.EMBARCADADISPOPERADOR_ID as embarcadaDispOperador, ")
				.append(" embdispop.DISPOSITIVOEMBARCADA_ID as dispositivoEmbarcadaId, ")
				.append(" embdispop.USUARIO_ID as usuarioId, ")
				.append(" embdispop.PUNTOVENTA_ID as puntoVentaId, ")
				.append(" embdispop.ACTIVO as activo ")
				.append(" from embarcada_disp_operador embdispop ")
				.append(" JOIN OPERADOR_EMBARCADA opeEmb ON (embdispop.USUARIO_ID = opeEmb.USUARIO_ID) ")
				.append(" where  ")
				.append(" embdispop.dispositivoembarcada_id = :dispositivoEmbarcadaId ")
				.append(" and embdispop.activo = 1 ")
				.append(" and opeEmb.activo = 1 ");
		Query qr = getSession().createSQLQuery(sQuery.toString())
				.addScalar("embarcadaDispOperador", new LongType())
				.addScalar("dispositivoEmbarcadaId", new LongType())
				.addScalar("usuarioId", new LongType())
				.addScalar("puntoVentaId", new LongType())
				.addScalar("activo", new BooleanType())
				.setResultTransformer(Transformers.aliasToBean(EmbarcadaDispOperador.class));

		qr.setLong("dispositivoEmbarcadaId", dispositivoEmbarcadaId);
		return (List<EmbarcadaDispOperador>) qr.list();
	}

}
