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

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
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.TaxaEmbarqueParadaDAO;
import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.TaxaEmbarqueParada;
import com.rjconsultores.ventaboletos.vo.esquemaoperacional.TaxaEmbarqueW2i;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

/**
 *
 * @author Desenvolvimento
 */
@Repository("taxaEmbarqueParadaDAO")
public class TaxaEmbarqueParadaHibernateDAO extends GenericHibernateDAO<TaxaEmbarqueParada, Integer>
        implements TaxaEmbarqueParadaDAO {

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

    public List<TaxaEmbarqueParada> buscarPorLocalidade(Parada parada) {
        Criteria c = getSession().createCriteria(getPersistentClass());
        c.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
        c.add(Restrictions.eq("paradaId", parada));

        return c.list();
    }
    
    public List<TaxaEmbarqueW2i> buscarEstoqueTaxaEmbarque(Parada origem, Empresa empresa, String txtKm, OrgaoConcedente orgao, Categoria categoria) throws SQLException {
		List<TaxaEmbarqueW2i> listaEstoqueAux = new ArrayList<TaxaEmbarqueW2i>();
		
		StringBuilder sql = new StringBuilder();
		
		sql.append(" SELECT ");
		sql.append("     C.TAXPOLC_ID taxpolc_id, EMP.NOMBEMPRESA nomeEmpresa, COALESCE(CS.DESCCATEGORIA, 'TODAS') categoria, P.cveParada, OC.DESCORGAO orgaoConcedente, C.KM km, ");
		sql.append("     (SELECT COUNT(*) FROM TAXPOL E WHERE E.ACTIVO = 1 AND E.TAXPOLC_ID = C.TAXPOLC_ID ) quantidadeEstoque ");
		sql.append(" FROM ");
		sql.append("     TAXPOLC C INNER JOIN ");
		sql.append("     EMPRESA EMP ON C.EMPRESA_ID = EMP.EMPRESA_ID INNER JOIN ");
		sql.append("     PARADA P ON C.LOCALIDADE_ID = P.PARADA_ID LEFT JOIN ");
		sql.append("     CATEGORIA CS ON C.CATEGORIA_ID = CS.CATEGORIA_ID INNER JOIN ");
		sql.append("     ORGAO_CONCEDENTE OC ON C.ORGAOCONCEDENTE_ID = OC.ORGAOCONCEDENTE_ID ");	
		sql.append(" WHERE  ");
		sql.append("     C.ACTIVO = 1 AND  ");
		
		if(empresa != null) {
			sql.append("     C.EMPRESA_ID = ").append(empresa.getEmpresaId()).append(" AND ");
		}
		
		if(StringUtils.isNotBlank(txtKm)) {
			sql.append("     C.KM >= ").append(txtKm).append(" AND  ");
		}
		
		if(categoria != null) {
			sql.append("     (C.CATEGORIA_ID = ").append(categoria.getCategoriaId()).append(" OR C.CATEGORIA_ID IS NULL) AND  ");
		}
		
		if(orgao != null) {
			sql.append("     C.ORGAOCONCEDENTE_ID = ").append(orgao.getOrgaoConcedenteId()).append(" AND ");
		}
		
		sql.append("     C.LOCALIDADE_ID = ").append(origem.getParadaId());
		
		sql.append(" ORDER BY  ");
		sql.append("     C.TAXPOLC_ID ");
		
		NamedParameterStatement stmt = new NamedParameterStatement(getSession().connection(), sql.toString());
		ResultSet rset = stmt.executeQuery();

		while (rset.next()) {
			TaxaEmbarqueW2i taxa = new TaxaEmbarqueW2i();
			
			taxa.setTaxpolc_id(rset.getLong("taxpolc_id"));
			taxa.setNomeEmpresa( rset.getString("nomeEmpresa"));
			taxa.setCategoria(rset.getString("categoria"));
			taxa.setCveParada(rset.getString("cveParada"));
			taxa.setOrgaoConcedente(rset.getString("orgaoConcedente"));
			taxa.setKm(rset.getLong("km"));
			taxa.setQuantidadeEstoque(rset.getLong("quantidadeEstoque"));
			
			listaEstoqueAux.add(taxa);
		}
		
		return listaEstoqueAux; 
	}

}
