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.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import com.rjconsultores.ventaboletos.dao.FiscalImpressoraDAO;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.FiscalFormapagoEmpresa;
import com.rjconsultores.ventaboletos.entidad.FiscalImpressora;
import com.rjconsultores.ventaboletos.entidad.FiscalRelgerencialEmpresa;
import com.rjconsultores.ventaboletos.entidad.FiscalTotnaofiscalEmpresa;
import com.rjconsultores.ventaboletos.entidad.FormaPago;
import com.rjconsultores.ventaboletos.entidad.TipoEventoExtra;

@Repository("fiscalImpressoraDAO")
public class FiscalImpressoraHibernateDAO extends GenericHibernateDAO<FiscalImpressora, Integer> implements FiscalImpressoraDAO {

	@Autowired
	public FiscalImpressoraHibernateDAO(@Qualifier("sessionFactory") SessionFactory factory) {
		setSessionFactory(factory);
	}
	
	public List<FiscalTotnaofiscalEmpresa> buscarTotsNaoFiscaisEmpresa(Integer empresaEcfId) {
		StringBuilder impostoHql = new StringBuilder();
		impostoHql.append(" select e");
		impostoHql.append(" from FiscalTotnaofiscalEmpresa e");
		impostoHql.append(" where e.activo = 1 and e.empresa.id = :empresaEcfId");
		
		Query qry = getSession().createQuery(impostoHql.toString());
		qry.setParameter("empresaEcfId", empresaEcfId);
		
		List<FiscalTotnaofiscalEmpresa> list = qry.list();
		
		return list;
	}
	
	public List<FiscalFormapagoEmpresa> buscarFormaPagoEmpresa(Integer empresaEcfId) {
		StringBuilder impostoHql = new StringBuilder();
		impostoHql.append(" select e");
		impostoHql.append(" from FiscalFormapagoEmpresa e");
		impostoHql.append(" where e.activo = 1 and e.empresa.id = :empresaEcfId");

		Query qry = getSession().createQuery(impostoHql.toString());
		qry.setParameter("empresaEcfId", empresaEcfId);
		
		List<FiscalFormapagoEmpresa> list = qry.list();
		
		return list;
	}

	public List<FiscalRelgerencialEmpresa> buscarItensRelgerencialEmpresa(Integer empresaEcfId) {
		
		StringBuilder impostoHql = new StringBuilder();
		impostoHql.append(" select e");
		impostoHql.append(" from FiscalRelgerencialEmpresa e");
		impostoHql.append(" where e.activo = 1 and e.empresa.id = :empresaEcfId");

		Query qry = getSession().createQuery(impostoHql.toString());
		qry.setParameter("empresaEcfId", empresaEcfId);
		
		List<FiscalRelgerencialEmpresa> list = qry.list();
		
		return list;
	}
	
	public List<FormaPago> buscarFormaPagoAplicacaoImpfiscal() {
		
		StringBuilder impostoHql = new StringBuilder();
		impostoHql.append(" select e");
		impostoHql.append(" from FormaPago e");
		impostoHql.append(" where e.activo = 1 and e.impfiscal = 1");

		Query qry = getSession().createQuery(impostoHql.toString());		
		List<FormaPago> list = qry.list();
		
		return list;
	}
	
	
	@Override
	public List<FiscalTotnaofiscalEmpresa> obtenerTodosTotnaofiscalEmpresa() {
		Criteria criteria = getSession().createCriteria(FiscalTotnaofiscalEmpresa.class);
		criteria.add(Restrictions.eq(ACTIVO, true));
		return criteria.list();
	}

	@Override
	public FiscalTotnaofiscalEmpresa obtenerIDTotnaofiscalEmpresa(Long id) {
		Criteria criteria = getSession().createCriteria(FiscalTotnaofiscalEmpresa.class);
		criteria.add(Restrictions.eq(ACTIVO, true));
		criteria.add(Restrictions.eq("fiscalformapagoempresaId", id));
		
		return (FiscalTotnaofiscalEmpresa) criteria.uniqueResult();
	}

	@Override
	public FiscalTotnaofiscalEmpresa buscarTotNaoFiscal(Empresa empresa,String tipoTotalizador){
		Criteria criteria = getSession().createCriteria(FiscalTotnaofiscalEmpresa.class);
		criteria.add(Restrictions.eq(ACTIVO, true));
		criteria.add(Restrictions.eq("empresa", empresa));
		criteria.add(Restrictions.eq("tipototalizador", tipoTotalizador));
		
		return (FiscalTotnaofiscalEmpresa) criteria.uniqueResult();
	}
	
	@Override
	public FiscalTotnaofiscalEmpresa buscarTotNaoFiscal(Empresa empresa,String tipoTotalizador,String descEcf){
		Criteria criteria = getSession().createCriteria(FiscalTotnaofiscalEmpresa.class);
		criteria.add(Restrictions.eq(ACTIVO, true));
		criteria.add(Restrictions.eq("empresa", empresa));
		criteria.add(Restrictions.eq("tipototalizador", tipoTotalizador));
		criteria.add(Restrictions.eq("descricao", descEcf));
		
		return (FiscalTotnaofiscalEmpresa) criteria.uniqueResult();
	}
	@Override
	public FiscalTotnaofiscalEmpresa buscarTotNaoFiscal(Empresa empresa,String tipoTotalizador,String descEcf,TipoEventoExtra tipoeventoextra){
		Criteria criteria = getSession().createCriteria(FiscalTotnaofiscalEmpresa.class);
		criteria.add(Restrictions.eq(ACTIVO, true));
		criteria.add(Restrictions.eq("empresa", empresa));
		criteria.add(Restrictions.eq("tipototalizador", tipoTotalizador));
		criteria.add(Restrictions.eq("descricao", descEcf));
		criteria.add(Restrictions.eq("tipoeventoextra", tipoeventoextra));
		
		return (FiscalTotnaofiscalEmpresa) criteria.uniqueResult();
	}
	
	@Override
	public FiscalTotnaofiscalEmpresa suscribirTotnaofiscalEmpresa(FiscalTotnaofiscalEmpresa entidad) {		
		getSession().save(entidad);	
		getSession().flush();
		return entidad ;
	}
	@Override
	public FiscalTotnaofiscalEmpresa actualizarTotnaofiscalEmpresa(FiscalTotnaofiscalEmpresa entidad) {		
		getSession().merge(entidad);	
		return entidad ;
	}

	@Override
	public void borrarTotnaofiscalEmpresa(FiscalTotnaofiscalEmpresa entidad) {		
		getSession().merge(entidad);
		getSession().flush();
	}

	
	@Override
	public List<FiscalFormapagoEmpresa> obtenerTodosFormapagoEmpresa() {
		Criteria criteria = getSession().createCriteria(FiscalFormapagoEmpresa.class);
		criteria.add(Restrictions.eq(ACTIVO, true));
		return criteria.list();
	}

	@Override
	public FiscalFormapagoEmpresa obtenerIDFormapagoEmpresa(Long id) {
		Criteria criteria = getSession().createCriteria(FiscalFormapagoEmpresa.class);
		criteria.add(Restrictions.eq(ACTIVO, true));
		criteria.add(Restrictions.eq("fiscalformapagoempresaId", id));
		
		return (FiscalFormapagoEmpresa) criteria.uniqueResult();
	}

	@Override
	public FiscalFormapagoEmpresa suscribirFormapagoEmpresa(FiscalFormapagoEmpresa entidad) {
		getSession().save(entidad);
		getSession().flush();
		return entidad ;
	}
	
	@Override
	public FiscalFormapagoEmpresa buscarFormaPago(Empresa empresa,String tipoformapago){
		Criteria criteria = getSession().createCriteria(FiscalFormapagoEmpresa.class);
		criteria.add(Restrictions.eq(ACTIVO, true));
		criteria.add(Restrictions.eq("empresa", empresa));
		criteria.add(Restrictions.eq("tipoformapago", tipoformapago));
		
		return (FiscalFormapagoEmpresa) criteria.uniqueResult();
	}
	
	@Override
	public FiscalFormapagoEmpresa buscarFormaPago(Empresa empresa,String tipoformapago,String descEcf){
		Criteria criteria = getSession().createCriteria(FiscalFormapagoEmpresa.class);
		criteria.add(Restrictions.eq(ACTIVO, true));
		criteria.add(Restrictions.eq("empresa", empresa));
		criteria.add(Restrictions.eq("descricao", descEcf));
		criteria.add(Restrictions.eq("tipoformapago", tipoformapago));
		
		return (FiscalFormapagoEmpresa) criteria.uniqueResult();
	}
	
	@Override
	public FiscalRelgerencialEmpresa buscarRelGerencial(Empresa empresa,String tipoRelGerencial){
		Criteria criteria = getSession().createCriteria(FiscalRelgerencialEmpresa.class);
		criteria.add(Restrictions.eq(ACTIVO, true));
		criteria.add(Restrictions.eq("empresa", empresa));
		criteria.add(Restrictions.eq("tiporelgerencial", tipoRelGerencial));
		
		return (FiscalRelgerencialEmpresa) criteria.uniqueResult();
	}

	@Override
	public FiscalFormapagoEmpresa actualizacionFormapagoEmpresa(FiscalFormapagoEmpresa entidad) {
		getSession().merge(entidad);
		getSession().flush();
		return entidad;
	}

	
	@Override
	public List<FiscalRelgerencialEmpresa> obtenerTodosRelgerencialEmpresa() {
		Criteria criteria = getSession().createCriteria(FiscalRelgerencialEmpresa.class);
		criteria.add(Restrictions.eq(ACTIVO, true));
		return criteria.list();
	}

	@Override
	public FiscalRelgerencialEmpresa obtenerIDRelgerencialEmpresa(Long id) {
		Criteria criteria = getSession().createCriteria(FiscalTotnaofiscalEmpresa.class);
		criteria.add(Restrictions.eq(ACTIVO, true));
		criteria.add(Restrictions.eq("fiscalformapagoempresaId", id));
		
		return (FiscalRelgerencialEmpresa) criteria.uniqueResult();
	}

	@Override
	public FiscalRelgerencialEmpresa suscribirRelgerencialEmpresa(FiscalRelgerencialEmpresa entidad) {
		getSession().save(entidad);
		getSession().flush();
		return entidad ;
	}

	@Override
	public FiscalRelgerencialEmpresa actualizacionRelgerencialEmpresa(FiscalRelgerencialEmpresa entidad) {
		getSession().merge(entidad);
		getSession().flush();
		return entidad;
	}	
}
