package com.rjconsultores.ventaboletos.dao.hibernate;

import java.util.List;

import org.hibernate.Criteria;
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.ClienteDAO;
import com.rjconsultores.ventaboletos.entidad.Cliente;
import com.rjconsultores.ventaboletos.entidad.Empresa;

@Repository("clienteDAO")
public class ClienteHibernateDAO extends GenericHibernateDAO<Cliente, Integer>
		implements ClienteDAO {

	private static final String FIELD_ACTIVO = "activo";

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

	@Override
	public List<Cliente> obtenerTodos() {
		Criteria c = getCriteriaClienteActivo();
		c.addOrder(Order.asc("id"));

		return c.list();
	}

	public List<Cliente> buscar(String nombCliente) {
		Criteria c = getCriteriaClienteActivo();
		c.add(Restrictions.eq("nombcliente", nombCliente));

		return c.list();
	}

	@Override
	public Cliente buscarPorNumeroFidelidade(String numeroFidelidade, Empresa empresa) {
		Criteria c = getSession().createCriteria(getPersistentClass());

		c.add(Restrictions.eq(FIELD_ACTIVO, Boolean.TRUE));
		
		Criteria clienteFidelidad = null;
		clienteFidelidad = c.createCriteria("listClienteFidelidad");
		clienteFidelidad.add(Restrictions.eq(FIELD_ACTIVO, Boolean.TRUE));
		clienteFidelidad.add(Restrictions.eq("empresa", empresa));
		
		Criteria tarjetaFidelidad = null;
		tarjetaFidelidad = clienteFidelidad.createCriteria("tarjetaFidelidad");
		tarjetaFidelidad.add(Restrictions.eq("numTarjeta", numeroFidelidade));
		tarjetaFidelidad.add(Restrictions.eq(FIELD_ACTIVO, Boolean.TRUE));

		c.setMaxResults(1);
		return (Cliente)c.uniqueResult();
	}

	@Override
	public List<Cliente> buscarPorDocumento(String documento) {
		Criteria c = getCriteriaClienteActivo();
		c.add(Restrictions.or(
		        Restrictions.eq("numIdentificaUno", documento),
		        Restrictions.eq("numIdentificaDos", documento)
		    ));
		return c.list();
	}

	private Criteria getCriteriaClienteActivo() {
		Criteria criteria = getSession().createCriteria(getPersistentClass());
		criteria.add(Restrictions.eq(FIELD_ACTIVO, Boolean.TRUE));
		return criteria;
	}
	
	@Override
	public Cliente buscarPorNumeroFidelidade(String numeroFidelidade) {
		Criteria c = getSession().createCriteria(getPersistentClass());

		Criteria clienteFidelidad = null;
		clienteFidelidad = c.createCriteria("listClienteFidelidad");
		clienteFidelidad.add(Restrictions.eq(FIELD_ACTIVO, Boolean.TRUE));
	
		
		Criteria tarjetaFidelidad = null;
		tarjetaFidelidad = clienteFidelidad.createCriteria("tarjetaFidelidad");
		tarjetaFidelidad.add(Restrictions.eq("numTarjeta", numeroFidelidade));
		tarjetaFidelidad.add(Restrictions.eq(FIELD_ACTIVO, Boolean.TRUE));

		
		c.setMaxResults(1);
		return (Cliente)c.uniqueResult();	}
}
