package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

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.RelatorioPassagensAGERBean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

public class RelatorioPassagensAGER extends Relatorio {

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

	public RelatorioPassagensAGER(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:00";
					}
					String fecFinalVenda = null;
					if (parametros.get("fecFinalVenda") != null) {
						fecFinalVenda = parametros.get("fecFinalVenda").toString() + " 23:59:59";
					}

					String linhaIds = parametros.get("linhaIds").toString();
					String empresa = parametros.get("empresa") != null ? parametros.get("empresa").toString() : "";
					String codOrgaoConcedente = parametros.get("CodOrgaoConcedente").toString();

					String sql = getSql(fecInicioVenda, fecFinalVenda, linhaIds, empresa, codOrgaoConcedente);

					SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
					NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);

					if (fecInicioVenda != null) {
						stmt.setTimestamp("fecInicioVenda", new java.sql.Timestamp(sdf.parse(fecInicioVenda).getTime()));
					}

					if (fecFinalVenda != null) {
						stmt.setTimestamp("fecFinalVenda", new java.sql.Timestamp(sdf.parse(fecFinalVenda).getTime()));
					}

					if (empresa != null && !empresa.equals("")) {
						stmt.setInt("empresa_id", Integer.parseInt(empresa));
					}

					if (codOrgaoConcedente != null) {
						stmt.setString("codOrgaoConcedente", codOrgaoConcedente);
					}

					ResultSet rset = null;

					rset = stmt.executeQuery();

					lsDadosRelatorio = new ArrayList<RelatorioPassagensAGERBean>();

					while (rset.next()) {
						RelatorioPassagensAGERBean bean = new RelatorioPassagensAGERBean();

						bean.setEmpresa(rset.getString("empresa"));

						bean.setCnpj(rset.getString("cnpj"));
						bean.setDescLinha(rset.getString("descruta"));
						bean.setDataVenda(rset.getString("datavenda"));
						bean.setCategoria(rset.getString("categoria"));
						bean.setStatus(rset.getString("status"));
						bean.setChbpe(rset.getString("chbpe"));
						bean.setNomePassageiro(rset.getString("NOMBPASAJERO"));


						// bean.setOrgao(rset.getString("ORGAO"));
						bean.setDataViagem(rset.getString("dataViagem"));
						bean.setHoraViagem(rset.getString("horaViagem"));
						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.setRG(rset.getString("RG"));
						bean.setUfOrgaoDoc(rset.getString("uforgaodoc"));
						bean.setCPF(rset.getString("CPF"));
						bean.setTel(rset.getString("tel"));
						bean.setEmail(rset.getString("email"));
						bean.setEndereco(rset.getString("endereco"));
						bean.setDesistencia(rset.getBoolean("desistencia"));
						bean.setOcupacao(rset.getString("ocupacao"));
						
						bean.setVlrTotal(rset.getBigDecimal("vlrTotal"));

						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 AGER: \n" + e);
					e.printStackTrace();
					throw e;
				}
			}
		});
	}

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

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSql(String fecInicioVenda, String fecFinalVenda, String linha, String empresa, String codOrgaoConcedente) {

		StringBuilder sql = new StringBuilder();

		sql.append("SELECT OC.DESCORGAO 				     AS ORGAO, ");

		sql.append("e.cnpj                     AS cnpj,");
		sql.append("TO_CHAR(bpe.dt_venda, 'DD/MM/YY')       AS datavenda, ");
		sql.append("r.descruta       AS descruta, ");
		sql.append("ca.desccategoria  AS categoria, ");
		sql.append("bpe.chbpe  AS chbpe, ");
		sql.append("b.preciopagado          AS tarifa, ");
		
		sql.append("  case bpe.codstat ");

		sql.append("  when '100' then ( ");
		sql.append("                  case ");
		sql.append("                    when bpe.tiposubstituicao is null and bpeSub.bpe_id is null and bpe.indcontingencia = 0 then 'Autorizado' ");
		sql.append("                    when bpe.tiposubstituicao is null and bpeSub.bpe_id is null and bpe.indcontingencia = 1 then 'Aut.Conting.' ");
		sql.append("                    when bpe.tiposubstituicao is not null then 'Autorizado/Substituição' ");
		sql.append("                    when bpeSub.bpe_id is not null then 'Autorizado/Substituído' ");
		sql.append("                    else 'Autorizado' ");
		sql.append("                  end ");
		sql.append("                  ) ");

		sql.append("  when '102' then ( ");
		sql.append("                case ");
		sql.append("                    when bpe.tiposubstituicao is not null then 'Substituição' ");
		sql.append("                    when bpeSub.bpe_id is not null then 'Substituído' ");
		sql.append("                end ");
		sql.append("                ) ");

		sql.append("  when '135' then ( ");
		sql.append("                case bpe.tipoevento ");
		sql.append("                    when '110111' then 'Cancelado' ");
		sql.append("                    when '110115' then 'Não embarcado' ");
		sql.append("                    else '' ");
		sql.append("                end ");
		sql.append("                ) ");

		sql.append("  when '150' then 'Aut.Conting.' ");
		sql.append("  when '-1' then 'Pendente Envio' ");
		sql.append("  when '-2' then 'Pendente Envio' ");
		sql.append("  when '-10' then 'Rejeitado Envio Contingência' ");
		sql.append("  when '-20' then 'Rejeitado Envio Contingência' ");

		sql.append("  else 'Rejeitado' ");
		sql.append("  end as status, ");

		sql.append("O.CODEMPRESAPORORGAO                     AS empresa,");
		sql.append("TO_CHAR(B.FECHORVIAJE, 'DD/MM/YY')       AS dataViagem, ");
		sql.append("TO_CHAR(b.FECHORVIAJE, 'HH24:MI') 		 AS horaViagem, ");
		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("b.descorgaodoc uforgaodoc, ");
		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("cd.DESCCALLE || ', ' || cd.NUMEXTERIOR || '-' || ");
		sql.append("cd.DESCIUDAD || '/' || cd.DESESTADO		 AS ENDERECO, ");
		sql.append("c.NUMTELEFONO 							 AS tel,");
		sql.append("c.DESCCORREO 							 AS email, ");
		sql.append("toc.DESCTIPO                             AS ocupacao, ");
		sql.append("CASE ");
		sql.append("WHEN B.MOTIVOCANCELACION_ID IN (31, 32, 90) ");
		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 vlrTotal ");
		sql.append("FROM BOLETO b ");
		sql.append("LEFT JOIN categoria 		 ca ON b.categoria_id = ca.categoria_id ");
		sql.append("LEFT JOIN empresa 		  	 e ON e.empresa_id   = b.EMPRESACORRIDA_ID ");
		sql.append("LEFT JOIN marca              m ON m.EMPRESA_ID = e.EMPRESA_ID ");
		sql.append("LEFT JOIN parada   			 ori ON ori.parada_id  = b.origen_id ");
		sql.append("LEFT JOIN parada  	     	 des ON des.parada_id  = b.destino_id ");
		sql.append("LEFT 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 CLIENTE_DIRECCION  cd ON cd.cliente_id  = c.cliente_id AND cd.ACTIVO = 1 ");
		sql.append("LEFT JOIN TIPO_OCUPACION     toc ON toc.TIPOOCUPACION_ID = b.TIPOOCUPACION_ID ");
		sql.append("LEFT JOIN ORGAO_CONCEDENTE 	 OC ON r.ORGAOCONCEDENTE_ID = OC.ORGAOCONCEDENTE_ID ");
		sql.append("LEFT 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 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 ");
		sql.append("INNER 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 b.boleto_id = bpe.boleto_id ");
		sql.append("LEFT JOIN bpe               bpesub ON ( bpesub.bpesubstituicao_id = bpe.bpe_id    AND bpesub.activo = 1 ) ");

		sql.append("WHERE b.MOTIVOCANCELACION_ID IS NULL ");
		sql.append("AND b.fechorventa BETWEEN :fecInicioVenda AND :fecFinalVenda  ");
		sql.append("AND (b.MOTIVOCANCELACION_ID not in (4) or b.MOTIVOCANCELACION_ID is null) ");

		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) {
			sql.append(" AND OC.ORGAOCONCEDENTE_ID = :codOrgaoConcedente");
		}

		sql.append(" group by OC.DESCORGAO, O.CODEMPRESAPORORGAO,  B.FECHORVIAJE, ca.desccategoria, ");
		sql.append(" ori.cveparada, ori.descparada, des.cveparada, B.NUMASIENTO, des.descparada,  ");
		sql.append(" b.FECCORRIDA, C.NUMTELEFONO,toc.DESCTIPO, c.DESCCORREO, CASE WHEN b.DESCNUMDOC  IS NOT NULL THEN  b.DESCNUMDOC ELSE c.NUMIDENTIFICAUNO END,  ");
		sql.append(" b.NUMFOLIOSISTEMA, CASE WHEN b.DESCNUMDOC2 IS NOT NULL THEN  b.DESCNUMDOC2 ELSE c.NUMIDENTIFICADOS END, b.NOMBPASAJERO, b.NUMIDENTIFICACION,  T.PRECIO, b.PRECIOPAGADO, b.descorgaodoc, r.PREFIXO, cd.DESCCALLE || ', ' || cd.NUMEXTERIOR || '-' || cd.DESCIUDAD || '/' || cd.DESESTADO, B.MOTIVOCANCELACION_ID, ");
		sql.append(" T.IMPORTEOUTROS, T.IMPORTEPEDAGIO, T.IMPORTESEGURO, T.IMPORTETAXAEMBARQUE, T.IMPORTETPP, b.descorgaodoc, ");
		sql.append(" b.IMPORTECATEGORIA, b.IMPORTEOUTROS, b.IMPORTEPEDAGIO, b.IMPORTESEGURO, b.IMPORTETAXAEMBARQUE, b.IMPORTETPP, e.nombempresa, e.cnpj, bpe.dt_venda, r.descruta, bpe.codstat, bpe.tiposubstituicao, bpesub.bpe_id,   bpe.indcontingencia, bpe.tipoevento,  bpe.chbpe ");

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

		return sql.toString();
	}
}