package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioGratuidadeARTESPBean;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class RelatorioGratuidadeARTESP extends Relatorio {

	private List<RelatorioGratuidadeARTESPBean> lsDadosRelatorio;
	private static Logger log = LogManager.getLogger(RelatorioGratuidadeARTESP.class);

	public RelatorioGratuidadeARTESP(Map<String, Object> parametros, Connection conexao) throws Exception {
		super(parametros, conexao);

		this.setCustomDataSource(new DataSource(this) {

			@Override
			public void initDados() throws Exception {
				try {
					Connection conexao = this.relatorio.getConexao();
	
					Map<String, Object> parametros = this.relatorio.getParametros();
	
					String fecInicioVenda = null;
					if (parametros.get("fecInicioVenda") != null) {
						fecInicioVenda = parametros.get("fecInicioVenda").toString() + " 00:00";
					}
					String fecFinalVenda = null;
					if (parametros.get("fecFinalVenda") != null) {
						fecFinalVenda = parametros.get("fecFinalVenda").toString() + " 23:59";
					}
	
					String tipGratuIds = parametros.get("tipGratuIds").toString();
					String linhaIds = parametros.get("linhaIds").toString();
					String empresa = parametros.get("empresa") != null ? parametros.get("empresa").toString() : "";
					String codOrgaoConcedente = parametros.get("CodOrgaoConcedente").toString();
					String estados = (String) parametros.get("ESTADOS_ID");
					Boolean indTabelaPreco = (Boolean) parametros.get("indTabelaPreco");
					
					String sql = null;
					
					if(BooleanUtils.toBoolean(indTabelaPreco)){
						sql = getSqlTabelaPreco(fecInicioVenda, fecFinalVenda, linhaIds, tipGratuIds, empresa, codOrgaoConcedente, estados);
					}else{
						sql = getSqlNoTabelaPreco(fecInicioVenda, fecFinalVenda, linhaIds, tipGratuIds, empresa, codOrgaoConcedente, estados);
					}
						
					NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
	
					if (fecInicioVenda != null) {
						stmt.setString("fecInicioVenda", fecInicioVenda);
					}
	
					if (fecFinalVenda != null) {
						stmt.setString("fecFinalVenda", fecFinalVenda);
					}
	
					if (empresa != null && !empresa.equals("")) {
						stmt.setInt("empresa_id", Integer.parseInt(empresa));
					}
					
					if (codOrgaoConcedente != null && Integer.valueOf(codOrgaoConcedente) > -1) {
						stmt.setInt("codOrgaoConcedente", Integer.valueOf(codOrgaoConcedente));
					}
	
					ResultSet rset = null;
	
					rset = stmt.executeQuery();
	
					lsDadosRelatorio = new ArrayList<RelatorioGratuidadeARTESPBean>();
	
					while (rset.next()) {
						RelatorioGratuidadeARTESPBean bean = new RelatorioGratuidadeARTESPBean();
	
						bean.setEmpresa(rset.getString("empresa"));
						bean.setOrgao(rset.getString("ORGAO"));
						
						Date fechorviaje = rset.getTimestamp("fechorviaje");
						
						if(fechorviaje != null) {
							bean.setDataViagem(DateUtil.getStringDate(fechorviaje, "dd/MM/yy"));
							bean.setHoraViagem(DateUtil.getStringDate(fechorviaje, "HH:mm"));
						}
						bean.setCodOrigem(rset.getString("codOrigem"));
						bean.setDescOrigem(rset.getString("descOrigem"));
						bean.setCodDestino(rset.getString("codDestino"));
						bean.setDescDestino(rset.getString("descDestino"));
						bean.setPoltrona(rset.getString("poltrona"));
						bean.setLinha(rset.getString("linha"));
						bean.setNumBilhete(rset.getString("numBilhete"));
						bean.setNomeIdoso(rset.getString("NOMBPASAJERO"));
						
						String tipoDoc1 = rset.getString("TIPODOC1");
						String tipoDoc2 = rset.getString("TIPODOC2");
						
						if(StringUtils.isNotEmpty(tipoDoc1)) {
							if(tipoDoc1.equals("1")) {
								bean.setRG(rset.getString("RG"));
							} else if(tipoDoc1.equals("2")) {
								bean.setCPF(rset.getString("RG"));
							} else {
								bean.setRG(rset.getString("RG"));
							}
						} else {
							bean.setRG(rset.getString("RG"));
						}

						if(StringUtils.isNotEmpty(tipoDoc2)) {
							if(tipoDoc2.equals("1")) {
								bean.setRG(rset.getString("CPF"));
							} else if(tipoDoc2.equals("2")) {
								bean.setCPF(rset.getString("CPF"));
							} else {
								bean.setCPF(rset.getString("CPF"));
							}
						} else {
							bean.setCPF(rset.getString("CPF"));
						}
						
						bean.setUfOrgaoDoc(rset.getString("uforgaodoc"));
						bean.setTel(rset.getString("tel"));
						bean.setEmail(rset.getString("email"));
						bean.setEndereco(retornarPrimeiroEndereco(rset.getString("endereco")));
						bean.setDesistencia(rset.getBoolean("desistencia"));
						bean.setVlrGratuidade(rset.getBigDecimal("vlrGratuidade"));
						bean.setChaveBPE(rset.getString("chaveBPE"));
	
						lsDadosRelatorio.add(bean);
					}
					
					log.info("TAMANHO == null ? " + lsDadosRelatorio == null);
						
					if (lsDadosRelatorio.size() > 0) {
						log.info("TAMANHO DA LISTA: " + lsDadosRelatorio.size());
						setLsDadosRelatorio(lsDadosRelatorio);
					}
				
				} catch (Exception e) {
					log.error("Erro na geração do relatorio ARTESP: \n" + e);
					e.printStackTrace();
					throw e; 
				}
			}
		});
	}
	
	public String retornarPrimeiroEndereco(String endereco) {	
	if(!StringUtils.isEmpty(endereco)) {
		final String[] primeiroEndereco = endereco.split("\\;;;;"); 
		return primeiroEndereco[0];		
	 }
	return endereco;
	}

	public void setLsDadosRelatorio(List<RelatorioGratuidadeARTESPBean> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
		
	}

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSqlTabelaPreco(String fecInicioVenda, String fecFinalVenda, String linha, String tipoGratu, String empresa, String codOrgaoConcedente, String estados) {

		StringBuilder sql = new StringBuilder();

		sql.append("SELECT distinct OC.DESCORGAO AS ORGAO, ");
		sql.append("O.CODEMPRESAPORORGAO                     AS empresa,");
		sql.append("B.FECHORVIAJE							 AS fechorviaje, ");
		sql.append("ori.cveparada                     		 AS codorigem, ");
		sql.append("ori.descparada                    		 AS descorigem, ");
		sql.append("des.cveparada                     		 AS coddestino, ");
		sql.append("des.descparada                    		 AS descdestino, ");
		sql.append("B.NUMASIENTO                      		 AS POLTRONA, ");
		sql.append("b.NUMFOLIOSISTEMA                		 AS NUMBILHETE, ");
		sql.append("b.NOMBPASAJERO                           AS NOMBPASAJERO, ");
		sql.append("CASE ");
		sql.append("WHEN b.DESCNUMDOC IS NOT NULL ");
		sql.append("THEN  b.DESCNUMDOC ELSE c.NUMIDENTIFICAUNO "); 
		sql.append("END  									 AS RG, ");
		sql.append("c.TIPOIDENTIFICAUNO_ID as TIPODOC1, ");
		sql.append("b.descorgaodoc uforgaodoc, ");
		sql.append("c.TIPOIDENTIFICADOS_ID as TIPODOC2, ");
		sql.append("CASE ");
		sql.append("WHEN b.DESCNUMDOC2 IS NOT NULL ");
		sql.append("THEN  b.DESCNUMDOC2 ELSE c.NUMIDENTIFICADOS ");
		sql.append("END 									 AS CPF, ");
		sql.append("r.PREFIXO      							 AS LINHA, ");
		sql.append(" (select ed.desccalle || ', ' || ed.numexterior || '-' || ed.desciudad || '/' || ed.desestado ");
		sql.append(" from cliente_direccion ed where ed.cliente_id = b.cliente_id and ed.activo = 1 and rownum = 1 )  ENDERECO, ");
		sql.append("COALESCE(c.numtelefono, CAJA.DESCTELEFONO) AS tel,");
		sql.append("c.DESCCORREO 							 AS email, ");
		sql.append("CASE ");
		sql.append("WHEN B.MOTIVOCANCELACION_ID IN (31, 32, 90, 23,10, 27) ");
		sql.append("THEN 1 ELSE 0 ");
		sql.append("END  									AS DESISTENCIA, ");
		sql.append(" (COALESCE(T.PRECIO, 0) + COALESCE(T.IMPORTEPEDAGIO,0)) ");
		sql.append("-(COALESCE(b.PRECIOPAGADO, 0)  + COALESCE(b.IMPORTEPEDAGIO,0))			AS vlrGratuidade, ");
		sql.append(" bpe.chbpe as chaveBPE ");
		sql.append("FROM BOLETO b ");
		sql.append(" LEFT JOIN CAJA ON B.BOLETO_ID = CAJA.TRANSACAO_ID ");
		sql.append("JOIN categoria 		 	    ca ON b.categoria_id = ca.categoria_id ");
		sql.append("JOIN empresa 		  	     e ON e.empresa_id   = b.EMPRESACORRIDA_ID ");
		sql.append("JOIN marca                   m ON m.EMPRESA_ID = e.EMPRESA_ID ");
		sql.append("JOIN parada   			     ori ON ori.parada_id  = b.origen_id ");
		sql.append("JOIN parada  	     	     des ON des.parada_id  = b.destino_id ");
		sql.append("JOIN ruta 			         r ON r.ruta_id      = b.ruta_id ");
		sql.append("LEFT JOIN cliente            c ON c.cliente_id = b.cliente_id ");
		sql.append("JOIN RUTA_COMBINACION 		 rc ON rc.ruta_id=r.ruta_id and rc.activo=1 ");
		sql.append("JOIN TRAMO 	                 tr	ON tr.tramo_id=rc.tramo_id and tr.activo=1 ");		
		sql.append("LEFT JOIN ORGAO_CONCEDENTE 	 OC ON r.ORGAOCONCEDENTE_ID = OC.ORGAOCONCEDENTE_ID ");
		sql.append("JOIN ORGAO_EMP_PARAM   	  	 O ON e.empresa_id = O.EMPRESA_ID AND OC.ORGAOCONCEDENTE_ID = O.ORGAOCONCEDENTE_ID AND O.ACTIVO = 1 ");
		sql.append("JOIN TARIFA 		   		 T ON r.RUTA_ID = T.RUTA_ID AND b.ORIGEN_ID = T.ORIGEN_ID AND b.DESTINO_ID = T.DESTINO_ID AND b.CLASESERVICIO_ID = T.CLASESERVICIO_ID AND m.MARCA_ID = T.MARCA_ID AND oc.ORGAOCONCEDENTE_ID = T.ORGAOCONCEDENTE_ID AND T.TRAMO_ID=tr.TRAMO_ID  AND T.ACTIVO=1 ");
		sql.append("JOIN VIGENCIA_TARIFA  vt ON vt.VIGENCIATARIFA_ID = t.VIGENCIATARIFA_ID AND b.FECHORVIAJE BETWEEN vt.FECINICIOVIGENCIA AND vt.FECFINVIGENCIA ");
		sql.append(" left JOIN BPE bpe ON bpe.BOLETO_ID = b.BOLETO_ID and bpe.activo = 1 ");
		sql.append(" left JOIN estado e ON e.CODIBGE = bpe.UF  ");
		sql.append("WHERE b.fechorviaje BETWEEN to_date(:fecInicioVenda,'dd/mm/yyyy hh24:mi') AND to_date(:fecFinalVenda,'dd/mm/yyyy hh24:mi') ");
		sql.append("AND (b.MOTIVOCANCELACION_ID not in (4) or b.MOTIVOCANCELACION_ID is null) ");
		
		if (tipoGratu != null) {
			sql.append(" AND b.CATEGORIA_ID in (").append(tipoGratu).append(") ");
		}

		if (linha != null && !linha.equals("Todas")) {
			sql.append(" AND r.ruta_id in (").append(linha).append(") ");
		}

		if (!empresa.isEmpty()) {
			sql.append("AND b.empresacorrida_id = :empresa_id  ");
		}
		
		if(codOrgaoConcedente != null && Integer.valueOf(codOrgaoConcedente) > -1) {
			sql.append(" AND OC.ORGAOCONCEDENTE_ID = :codOrgaoConcedente");
		}
		if (estados != null) {
			sql.append(" AND e.ESTADO_ID IN ( " + estados + " )");
		}
		
		sql.append(" ORDER BY OC.DESCORGAO, O.CODEMPRESAPORORGAO,  b.FECHORVIAJE, descorigem, descdestino ");

		return sql.toString();
	}
	
	private String getSqlNoTabelaPreco(String fecInicioVenda, String fecFinalVenda, String linha, String tipoGratu, String empresa, String codOrgaoConcedente, String estados) {

		StringBuilder sql = new StringBuilder();

		sql.append("SELECT OC.DESCORGAO AS ORGAO,");
		sql.append("       O.CODEMPRESAPORORGAO AS empresa,");
		sql.append("       B.FECHORVIAJE AS fechorviaje,");
		sql.append("       ori.cveparada AS codorigem,");
		sql.append("       ori.descparada AS descorigem,");
		sql.append("       des.cveparada AS coddestino,");
		sql.append("       des.descparada AS descdestino,");
		sql.append("       B.NUMASIENTO AS POLTRONA,");
		sql.append("       b.NUMFOLIOSISTEMA AS NUMBILHETE,");
		sql.append("       b.NOMBPASAJERO AS NOMBPASAJERO,");
		sql.append("       CASE");
		sql.append("           WHEN b.DESCNUMDOC IS NOT NULL THEN b.DESCNUMDOC");
		sql.append("           ELSE c.NUMIDENTIFICAUNO");
		sql.append("       END AS RG,");
		sql.append("       c.TIPOIDENTIFICAUNO_ID AS TIPODOC1,");
		sql.append("       b.descorgaodoc uforgaodoc,");
		sql.append("       c.TIPOIDENTIFICADOS_ID AS TIPODOC2,");
		sql.append("       CASE");
		sql.append("           WHEN b.DESCNUMDOC2 IS NOT NULL THEN b.DESCNUMDOC2");
		sql.append("           ELSE c.NUMIDENTIFICADOS");
		sql.append("       END AS CPF,");
		sql.append("       r.PREFIXO AS LINHA,");
		sql.append(" (select ed.desccalle || ', ' || ed.numexterior || '-' || ed.desciudad || '/' || ed.desestado ");
		sql.append(" from cliente_direccion ed where ed.cliente_id = b.cliente_id and ed.activo = 1 and rownum = 1 )  ENDERECO, ");
		sql.append("      COALESCE(c.numtelefono, CAJA.DESCTELEFONO) AS tel,");
		sql.append("      c.DESCCORREO AS email,");
		sql.append("      CASE");
		sql.append("      WHEN B.MOTIVOCANCELACION_ID IN (31,32, 90, 23,10, 27 ) THEN 1 ELSE 0 END AS DESISTENCIA, ");
		sql.append("      (COALESCE(NULL, b.preciobase) + COALESCE(NULL, 0)) -(COALESCE(b.PRECIOPAGADO, 0) + COALESCE(b.IMPORTEPEDAGIO, 0)) AS vlrGratuidade,");
		sql.append("      bpe.chbpe AS chaveBPE ");
		sql.append(" FROM BOLETO b ");
		sql.append(" LEFT JOIN CAJA ON B.BOLETO_ID = CAJA.TRANSACAO_ID ") ;
		sql.append(" JOIN categoria ca ON b.categoria_id = ca.categoria_id ");
		sql.append(" JOIN empresa e ON e.empresa_id = b.EMPRESACORRIDA_ID ");
		sql.append(" JOIN marca m ON m.EMPRESA_ID = e.EMPRESA_ID ");
		sql.append(" JOIN parada ori ON ori.parada_id = b.origen_id ");
		sql.append(" JOIN parada des ON des.parada_id = b.destino_id ");
		sql.append(" JOIN ruta r ON r.ruta_id = b.ruta_id ");
		sql.append("LEFT JOIN cliente c ON c.cliente_id = b.cliente_id ");
		sql.append(" LEFT JOIN ORGAO_CONCEDENTE OC ON r.ORGAOCONCEDENTE_ID = OC.ORGAOCONCEDENTE_ID ");
		sql.append(" JOIN ORGAO_EMP_PARAM O ON e.empresa_id = O.EMPRESA_ID AND OC.ORGAOCONCEDENTE_ID = O.ORGAOCONCEDENTE_ID AND O.ACTIVO = 1 ");
		sql.append(" LEFT JOIN BPE bpe ON bpe.BOLETO_ID = b.BOLETO_ID ");
		sql.append(" LEFT JOIN estado e ON e.CODIBGE = bpe.UF AND e.ACTIVO =1 ");
		sql.append(" WHERE b.fechorviaje BETWEEN to_date(:fecInicioVenda,'dd/mm/yyyy hh24:mi') AND to_date(:fecFinalVenda,'dd/mm/yyyy hh24:mi') ");
		sql.append(" AND (b.MOTIVOCANCELACION_ID not in (4) or b.MOTIVOCANCELACION_ID is null) ");
		
		if (tipoGratu != null) {
			sql.append(" AND b.CATEGORIA_ID in (").append(tipoGratu).append(") ");
		}

		if (linha != null && !linha.equals("Todas")) {
			sql.append(" AND r.ruta_id in (").append(linha).append(") ");
		}

		if (!empresa.isEmpty()) {
			sql.append("AND b.empresacorrida_id = :empresa_id  ");
		}
		
		if(codOrgaoConcedente != null && Integer.valueOf(codOrgaoConcedente) > -1) {
			sql.append(" AND OC.ORGAOCONCEDENTE_ID = :codOrgaoConcedente  ");
		}
		if (estados != null) {
			sql.append(" AND e.ESTADO_ID IN ( " + estados + " )");
		}

		sql.append("ORDER BY OC.DESCORGAO, ");
		sql.append("         O.CODEMPRESAPORORGAO,");
		sql.append("         b.FECHORVIAJE,");
		sql.append("         descorigem,");
		sql.append("         descdestino ");

		return sql.toString();
	}
}