/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.dao.hibernate;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.hibernate.type.BooleanType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import com.rjconsultores.ventaboletos.dao.CategoriaDescuentoDAO;
import com.rjconsultores.ventaboletos.entidad.CategoriaDescuento;

/**
 *
 * @author Administrador
 */
@Repository("categoriaDescuentoDAO")
public class CategoriaDescuentoHibernateDAO
        extends GenericHibernateDAO<CategoriaDescuento, Integer>
        implements CategoriaDescuentoDAO {

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

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

        return c.list();
    }
    
    @Override
    public CategoriaDescuento pesquisarPorCategoriaEmpresa(Integer categoriaId, Integer empresaId){
    	Criteria c = getSession().createCriteria(getPersistentClass())
    	.createAlias("categoriaCtrl", "ctrl")
    	.createAlias("ctrl.empresa", "e")
        .add(Restrictions.eq(ACTIVO, Boolean.TRUE))
        .add(Restrictions.eq("e.empresaId", empresaId))
        .add(Restrictions.eq("categoria.categoriaId", categoriaId));
    	c.setMaxResults(1);

    	return (CategoriaDescuento) c.uniqueResult();
    }

	@Override
	public boolean isAplicaTarifaMinima(Integer categoriaId, Integer empresaId) {
		
		StringBuilder sql = new StringBuilder(); 
		
		sql.append(" SELECT cd.indnaoaplicatarifaminima as tarifa ");
		sql.append(" from categoria_descuento cd ");
		sql.append(" inner join categoria_ctrl cc "); 
		sql.append("   on cc.categoriactrl_id = cd.categoriactrl_id "); 
		sql.append("   and cc.empresa_id = :empresaId ");
		sql.append("   and cc.activo = 1 ");
		sql.append(" where cd.categoria_id = :categoriaId ");
		sql.append("  and cd.activo = 1 ");
		sql.append("  and cd.indnaoaplicatarifaminima = 1 ");
		
		Query query = getSession().createSQLQuery(sql.toString())
				.addScalar("tarifa", BooleanType.INSTANCE);
		
		query.setParameter("empresaId", empresaId );
		query.setParameter("categoriaId", categoriaId );
		
		List<Boolean> retorno = (List<Boolean>)query.list();
		
		//Caso não encontre categoria desconto com indnaoaplica deve se aplicar caso exista
		if(retorno ==null || retorno.isEmpty()) {
			return true;
		}

		return retorno !=null && !retorno.isEmpty() && Boolean.TRUE.equals(retorno.get(0)) ?  Boolean.TRUE :  Boolean.FALSE;
	}
}
