package com.rjconsultores.ventaboletos.dao.hibernate;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import com.rjconsultores.ventaboletos.dao.ConexionCtrlDAO;
import com.rjconsultores.ventaboletos.entidad.ConexionCtrl;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.PricingConexao;
import com.rjconsultores.ventaboletos.vo.conexion.OrdenarLocalidadesGeradas;
import com.rjconsultores.ventaboletos.vo.parada.ConexionCtrlVO;
import com.rjconsultores.ventaboletos.vo.parada.ParadaVOConexionRuta;

@Repository("conexionCtrlDAO")
public class ConexionCtrlHibernateDAO extends GenericHibernateDAO<ConexionCtrl, Long>
		implements ConexionCtrlDAO {
	
	@Autowired
	private ConexionRutaConfHibernateDAO confRutaDAO;

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

	@Override
	public List<ConexionCtrl> buscarConexionesCtrl(Integer origenId, Integer destinoId) {
		
		StringBuilder sb = new StringBuilder();
		sb.append(" from   ConexionCtrl ");
		sb.append(" where  activo = 1 ");
		
		if (origenId != null) {
			sb.append("	and origenId =  ").append(origenId);
		}
		if (destinoId != null) {
			sb.append("	and destinoId =  ").append(destinoId);
		}

		Query query = getSession().createQuery(sb.toString());
		List<ConexionCtrl> list = query.list();
		
		return list;
	}
	
	@Override
	@SuppressWarnings("unchecked")
	public List<ConexionCtrl> buscarTodasConexionesCtrlPricing() {
		StringBuilder sb = new StringBuilder();
		sb.append(" from   ConexionCtrl ");
		sb.append(" where  activo = 1 and indPricing = 1 ");
		
		Query query = getSession().createQuery(sb.toString());
		List<ConexionCtrl> list = query.list();
		
		return list;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<ParadaVOConexionRuta> carregarConexoesCadastradas(Long conexionctrlId) {
		
		if(conexionctrlId == null) {
			return null;
		}
		
		StringBuilder sQuery = new StringBuilder();
		sQuery.append(confRutaDAO.getSQLCarregarConexoesCadastradas())
			  .append(" where ")
			  .append(" coctrl.activo = 1 and coctrl.conexionctrl_id = :conexionctrl_id ");
		
		Query qr = getSession().createSQLQuery(sQuery.toString());
		qr.setParameter("conexionctrl_id", conexionctrlId);
		
		List<ParadaVOConexionRuta> localidadesCombinadas = new ArrayList<ParadaVOConexionRuta>(0);
		List<ConexionCtrl> listConexionCtrl = new ArrayList<ConexionCtrl>(0);		
		List<ConexionCtrlVO> listConexionCtrlVO = new ArrayList<ConexionCtrlVO>(0);
		
		List<Object[]> result = qr.list();
		
		confRutaDAO.transformarObjetosConexao(localidadesCombinadas, listConexionCtrl, listConexionCtrlVO, result);
		
		Collections.sort(localidadesCombinadas, new OrdenarLocalidadesGeradas());
		
		return localidadesCombinadas;
		
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<ParadaVOConexionRuta> carregarConexoesCadastradas(Integer origenId, Integer destinoId, Long conexionctrlId) {
		
		if(origenId == null || destinoId == null) {
			return null;
		}
		
		StringBuilder sQuery = new StringBuilder();
		sQuery.append(" select distinct ")
			  .append(" 	origem.descparada as origem, destino.descparada as destino, c.conexionctrl_id ")
			  .append(" from")
			  .append(" 	conexion_ctrl c inner join ")
			  .append(" 	parada origem on origem.parada_id = c.origen_id inner join ")
			  .append(" 	parada destino on destino.parada_id = c.destino_id ")
			  .append(" where ")
			  .append(" c.activo = 1 and c.indpricing = 1 and c.origen_id = :origenId  and c.destino_id = :destinoId  ");
			
		if(conexionctrlId != null) {
			sQuery.append(" and c.conexionctrl_id = :conexionctrlId ");
		}
		
		Query qr = getSession().createSQLQuery(sQuery.toString());
		qr.setParameter("origenId", origenId);
		qr.setParameter("destinoId", destinoId);
		
		if(conexionctrlId != null) {
			qr.setParameter("conexionctrlId", conexionctrlId);
		}
		
		List<ParadaVOConexionRuta> localidadesCombinadas = new ArrayList<ParadaVOConexionRuta>(0);
		
		List<Object[]> result = qr.list();
		
		for (Object[] tupla : result) {
			
			Parada paradaOrigem = new Parada(origenId, null, tupla[0].toString());
			Parada paradaDestino = new Parada(destinoId, null, tupla[1].toString());
			
			conexionctrlId =  Long.valueOf(tupla[2].toString());
			
			ConexionCtrlVO conex = new ConexionCtrlVO(origenId, destinoId);
			conex.setConexionctrlId(conexionctrlId);
			conex.setIndPricing(true);
			conex.setOrigenId(origenId);
			conex.setDestinoId(destinoId);
			
			ParadaVOConexionRuta parada = new ParadaVOConexionRuta();
			
			parada.setParadaOrigem(paradaOrigem);
			parada.setParadaDestino(paradaDestino);
			parada.setConexionCtrl(conex);
			
			localidadesCombinadas.add(parada);
		}
		
		return localidadesCombinadas;
		
	}
	
	public void limparPesquisaPricingConexao(Integer pricingId) {
		StringBuilder sQuery = new StringBuilder("DELETE FROM PRICING_CONEXAO_VALOR WHERE PRICING_ID = :pricingId AND TRUNC(FECMODIF) = TRUNC(SYSDATE) ");
		SQLQuery qrUpdate = getSession().createSQLQuery(sQuery.toString());
		
		qrUpdate.setParameter("pricingId", pricingId);
		qrUpdate.executeUpdate();
	}
}
