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

import java.util.Collection;
import java.util.Collections;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;
import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
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.MarcaDAO;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.Usuario;

/**
 * 
 * @author Administrador
 */
@Repository("marcaDAO")
public class MarcaHibernateDAO extends GenericHibernateDAO<Marca, Short>
		implements MarcaDAO {

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

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

		return c.list();

	}

	@Override
	public List<Marca> buscarPorNome(String nomeMarca) {
		Criteria c = getSession().createCriteria(getPersistentClass());
		c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
		c.add(Restrictions.eq("descmarca", nomeMarca));

		return c.list();
	}

	@Override
	public List<Marca> buscarTodosExceto(Usuario usuario, Integer... idMarca) {
		String hql = " select new com.rjconsultores.ventaboletos.entidad.Marca(marca.marcaId, marca.descmarca) from Marca marca, UsuarioEmpresa ue" +
				" where marca.empresa = ue.empresa and ue.usuarioLog = :usuarioId ";

		hql = hql + " and marca.marcaId not in ( " + StringUtils.join(idMarca, ",") + ")";

		Query sq = getSession().createQuery(hql);
		sq.setParameter("usuarioId", usuario);
		List<Marca> lsMarca = sq.list();
		return lsMarca;

	}

	@Override
	public List<Marca> buscarDescricaoIdMarca() {
		String hql = " select new com.rjconsultores.ventaboletos.entidad.Marca(m.marcaId, m.descmarca) from Marca m where m.marcaId <> -1 ";
		Query sq = getSession().createQuery(hql);
		List<Marca> lsMarca = sq.list();
		return lsMarca;
	}

	@Override
	public List<Marca> buscarMarcaPorEmpresa(List<Empresa> empresa) {
		if ((empresa == null) || (empresa.isEmpty())) {
			return Collections.emptyList();
		}
		Collection idsEmpresa = CollectionUtils.transformedCollection(empresa, new Transformer() {

			@Override
			public Object transform(Object input) {
				return ((Empresa) input).getEmpresaId();
			}
		});

		Criteria c = makeCriteria();
		c.add(Restrictions.eq(ACTIVO, true));
		c.add(Restrictions.in("empresa", idsEmpresa));
		c.setFetchMode("logotipomarca", FetchMode.DEFAULT);

		return c.list();
	}

	@Override
	public Marca buscarMarcaPorEmpresa(Empresa empresa) {
		Criteria c = makeCriteria();
		c.add(Restrictions.eq(ACTIVO, true));
		c.add(Restrictions.eq("empresa", empresa));
		List<Marca> marcas = c.list();
		if (marcas != null && !marcas.isEmpty()) {
			return marcas.get(0);
		}
		return null;
	}

}
