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.SQLQuery;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.hibernate.transform.AliasToBeanResultTransformer;
import org.hibernate.type.IntegerType;
import org.hibernate.type.StringType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import com.rjconsultores.ventaboletos.dao.OperadorEmbarcadaDAO;
import com.rjconsultores.ventaboletos.entidad.OperadorEmbarcada;
import com.rjconsultores.ventaboletos.entidad.PuntoVentaVO;

@Repository("operadorEmbarcadaDAO")
@SuppressWarnings("unchecked")
public class OperadorEmbarcadaHibernateDAO extends GenericHibernateDAO<OperadorEmbarcada, Long> implements OperadorEmbarcadaDAO {
	private static Logger log = LogManager.getLogger(OperadorEmbarcadaHibernateDAO.class);
	
	@Autowired
	public OperadorEmbarcadaHibernateDAO(@Qualifier("sessionFactory") SessionFactory factory) {
		setSessionFactory(factory);
	}

	@Override
	public List<OperadorEmbarcada> buscarTodosOperadores() {
		start = System.currentTimeMillis();
		Criteria c = getSession().createCriteria(getPersistentClass());
		c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));

		List<OperadorEmbarcada> retorno = c.list();
		log.debug( printInfo("buscarOperadorEmbarcadaPorUsuario", start));
		return retorno;
	}

	@Override
	public OperadorEmbarcada burcarOperadorPorId(Long operadorEmbarcadaID) {
		start = System.currentTimeMillis();
		Criteria c = getSession().createCriteria(getPersistentClass());
		c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
		c.add(Restrictions.eq("operadorEmbarcadaId", operadorEmbarcadaID));

		OperadorEmbarcada retorno = (OperadorEmbarcada) c.uniqueResult();
		log.debug( printInfo("burcarOperadorPorId", start));
		return retorno;
	}

	@Override
	public OperadorEmbarcada buscarOperadorEmbarcadaPorUsuario(Integer idUsuario) {
		start = System.currentTimeMillis();
		Criteria c = getSession().createCriteria(getPersistentClass());
		c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
		c.add(Restrictions.eq("usuario.usuarioId", idUsuario));
		  
		OperadorEmbarcada op = (OperadorEmbarcada) c.uniqueResult();
		log.debug( printInfo("buscarOperadorEmbarcadaPorUsuario", start));
		return op;
	}

	@Override
	public PuntoVentaVO getPuntoVentaVO(Integer operador) {
		start = System.currentTimeMillis();
		StringBuilder sb = new StringBuilder();
		sb.append(" SELECT ");
		sb.append(" PV.PUNTOVENTA_ID AS puntoventaId, ");
		sb.append(" PV.NOMBPUNTOVENTA AS nombpuntoventa ");
		sb.append(" FROM ");
		sb.append(" USUARIO_UBICACION USU ");
		sb.append(" INNER JOIN PUNTO_VENTA PV ON USU.PUNTOVENTA_ID = PV.PUNTOVENTA_ID ");
		sb.append("  WHERE ");
		sb.append("  USU.USUARIO_ID = :usuario_id ");
		// sb.append(" AND PV.EMPRESA_ID = :empresa_id ");
		sb.append(" AND USU.ACTIVO = 1 AND PV.ACTIVO = 1 ");
		sb.append( " AND  USU.padrao=1 ");

		SQLQuery sql = getSession().createSQLQuery(sb.toString())
				.addScalar("puntoventaId", IntegerType.INSTANCE)
				.addScalar("nombpuntoventa", StringType.INSTANCE);
		sql.setInteger("usuario_id", operador);
		// sql.setInteger("empresa_id", empresa);
		sql.setResultTransformer(new AliasToBeanResultTransformer(PuntoVentaVO.class));
		PuntoVentaVO puntoVentaVO = (PuntoVentaVO) sql.uniqueResult();
		
		log.debug( printInfo("getPuntoVentaVO", start));		
		return puntoVentaVO;
	}

}
