package com.rjconsultores.ventaboletos.dao.hibernate;

import java.util.List;

import org.hibernate.SQLQuery;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.hibernate.transform.AliasToBeanResultTransformer;
import org.hibernate.type.BigDecimalType;
import org.hibernate.type.DateType;
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.ConfContratoPuntoVentaDAO;
import com.rjconsultores.ventaboletos.entidad.ConfContratoPuntoVenta;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.PuntoVentaVO;
import com.rjconsultores.ventaboletos.vo.configuracioneccomerciales.ConfLayoutContratoVO;

@Repository("confContratoPuntoVentaDAO")
public class ConfContratoPuntoVentaHibernateDAO extends GenericHibernateDAO<ConfContratoPuntoVenta, Integer> implements ConfContratoPuntoVentaDAO {

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

	@Override
	public List<ConfContratoPuntoVenta> buscarConfContratoPorPuntoVenta(PuntoVenta puntoVenta) {
				
		List<ConfContratoPuntoVenta> abastos = findByCriteria(Restrictions.eq("puntoventa", puntoVenta), Restrictions.eq(ACTIVO, Boolean.TRUE));		
		return abastos;
	}

	@Override
	public ConfLayoutContratoVO buscarInformacoesPontoVendaparaGerarContratos(Integer puntoVentaId, Integer empresaId) {
		

		StringBuilder sb = new StringBuilder();

		sb.append("select pa.descparada as nomeLocalidade,");
		sb.append("       pv.numdocpuntoventa as CNPJ,");
		sb.append("       pv.fecabertura as dataAbertura,");
		sb.append("       pv.razonsocial as razaoSocial,");
		sb.append("       ci.nombciudad as nomeCidade,");
		sb.append("       pv.desccorreo as email,");
		sb.append("       pv.codpostal codigoPostal,");
		sb.append("       pv.direccionnumero as numero,");
		sb.append("       ptoco.passagembaixa as passagemBaixa,");
		sb.append("       ptoco.passagemalta as passagemAlta,");
		sb.append("       ptoco.seguroobrigatoriobaixa as seguroObrigatorioBaixa,");
		sb.append("       ptoco.seguroobrigatorioalta as seguroObrigatorioAlta,");
		sb.append("       ptoco.valor_venda_gap_comp as valorVendaGapBaixa,");
		sb.append("       ptoco.valor_venda_gap_alta_comp as valorVendaGapAlta,");
		sb.append("       ptoco.valor_imp_gap_comp as valorVendaGapBaixaImp,");
		sb.append("       ptoco.valor_imp_gap_alta_comp as valorVendaGapAltaImp,");
		sb.append("       ptoco.segurobaixa as seguroBaixa,");
		sb.append("       ptoco.seguroalta as seguroAlta,");
		sb.append("       ptoco.outrosbaixa as outrosBaixa,");
		sb.append("       ptoco.outrosalta as outrosAlta,");
		sb.append("       ptoco.excessobaixa as excesssoBaixa,");
		sb.append("       ptoco.excessoalta as excesssoAlta, ");
		sb.append("       pvt.nome as nomeTitular, ");
		sb.append("       ifi.nome as nomeBanco, ");
		sb.append("       pva.numagencia as numeroAgencia, ");
		sb.append("       pva.numconta as numeroConta, ");
		sb.append("       pv.tipo_socio as tipoSocio, ");
		sb.append("       pv.direccioncalle as rua, ");
		sb.append("       co.desccolonia as bairro ");
		sb.append("from punto_venta pv ");
		sb.append("inner join ptovta_comissao ptoco on (ptoco.puntoventa_id = pv.puntoventa_id ");
		sb.append("                                     and ptoco.empresa_id =:empresaId )");
		sb.append("inner join ptovta_empresa pe on (pe.puntoventa_id = pv.puntoventa_id ");
		sb.append("                                 and ptoco.empresa_id = pe.empresa_id) ");
		sb.append("inner join parada pa on (pv.parada_id = pa.parada_id)");
		sb.append("inner join colonia co on (co.colonia_id = pv.colonia_id) ");
		sb.append("inner join ciudad ci on (ci.ciudad_id = co.ciudad_id) ");
		sb.append("inner join ptovta_titular pvt on (pvt.ptovtatitular_id = pv.ptovtatitular_id) ");
		sb.append("inner join ptovta_agencia pva on (pva.ptovtaagencia_id = pv.ptovtaagencia_id) ");
		sb.append("inner join insti_financeira ifi on  (ifi.instifinanceira_id = pva.instifinanceira_id) ");
		sb.append("where pv.puntoventa_id =:puntoVentaId ");
		sb.append("  and ptoco.empresa_id  =:empresaId ");
		sb.append("  and pv.activo =1 ");
		sb.append("  and ptoco.activo =1 ");
		sb.append("  and pe.activo = 1 ");

		
		
		SQLQuery sql = getSession().createSQLQuery(sb.toString())
				.addScalar("nomeLocalidade", StringType.INSTANCE)
				.addScalar("CNPJ", StringType.INSTANCE)
				.addScalar("dataAbertura", DateType.INSTANCE)
				.addScalar("razaoSocial", StringType.INSTANCE)
				.addScalar("nomeCidade", StringType.INSTANCE)
				.addScalar("email", StringType.INSTANCE)
				.addScalar("codigoPostal", StringType.INSTANCE)
				.addScalar("numero", StringType.INSTANCE)
				.addScalar("passagemBaixa", BigDecimalType.INSTANCE)
				.addScalar("passagemAlta", BigDecimalType.INSTANCE)
				.addScalar("seguroObrigatorioBaixa", BigDecimalType.INSTANCE)
				.addScalar("seguroObrigatorioAlta", BigDecimalType.INSTANCE)
				.addScalar("valorVendaGapBaixa", BigDecimalType.INSTANCE)
				.addScalar("valorVendaGapAlta", BigDecimalType.INSTANCE)
				.addScalar("valorVendaGapBaixaImp", BigDecimalType.INSTANCE)
				.addScalar("valorVendaGapAltaImp", BigDecimalType.INSTANCE)
				.addScalar("seguroBaixa", BigDecimalType.INSTANCE)
				.addScalar("seguroAlta", BigDecimalType.INSTANCE)
				.addScalar("outrosBaixa", BigDecimalType.INSTANCE)
				.addScalar("outrosAlta", BigDecimalType.INSTANCE)
				.addScalar("excesssoBaixa", BigDecimalType.INSTANCE)
				.addScalar("excesssoAlta", BigDecimalType.INSTANCE)
				.addScalar("nomeTitular", StringType.INSTANCE)
				.addScalar("nomeBanco", StringType.INSTANCE)
				.addScalar("numeroAgencia", StringType.INSTANCE)
				.addScalar("numeroConta", StringType.INSTANCE)
				.addScalar("tipoSocio", StringType.INSTANCE)
				.addScalar("bairro", StringType.INSTANCE)
				.addScalar("rua", StringType.INSTANCE);
				

				
		sql.setInteger("empresaId", empresaId);
		sql.setInteger("puntoVentaId", puntoVentaId);
		sql.setResultTransformer(new AliasToBeanResultTransformer(ConfLayoutContratoVO.class));
		
		@SuppressWarnings("unchecked")
		ConfLayoutContratoVO confLayoutContratoVO = (ConfLayoutContratoVO) sql.uniqueResult();
		
		return confLayoutContratoVO;
	}
}
