package com.rjconsultores.ventaboletos.relatorios.impl;

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

import com.rjconsultores.ventaboletos.relatorios.utilitarios.ArrayDataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioRemarcacaoPassagensTransferenciaBean;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

public class RelatorioRemarcacaoPassagensTransferencia extends Relatorio {

	private List<RelatorioRemarcacaoPassagensTransferenciaBean> lsDadosRelatorio;

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

		this.setCustomDataSource(new ArrayDataSource(this) {

			public void initDados() throws Exception {
				Connection conexao = this.relatorio.getConexao();
				Map<String, Object> parametros = this.relatorio.getParametros();
				
				String sql = getSql((Integer) parametros.get("EMPRESA_ID"), (String) parametros.get("PUNTOVENTA_ID"),
						            (Boolean) parametros.get("CONSIDERAR_AMBOS"), (Boolean) parametros.get("CONSIDERAR_APENAS_REATIVADO"),
						            (Boolean) parametros.get("CONSIDERAR_APENAS_TRANSFERENCIA"));

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);

				stmt.setTimestamp("DATA_INICIAL", new Timestamp(DateUtil.inicioFecha((Date) parametros.get("DATA_INICIAL")).getTime()));
				stmt.setTimestamp("DATA_FINAL", new Timestamp(DateUtil.fimFecha((Date) parametros.get("DATA_FINAL")).getTime()));

				ResultSet rset = stmt.executeQuery();

				lsDadosRelatorio = new ArrayList<RelatorioRemarcacaoPassagensTransferenciaBean>();

				while (rset.next()) {
					RelatorioRemarcacaoPassagensTransferenciaBean bean = new RelatorioRemarcacaoPassagensTransferenciaBean();
					
					bean.setSiglaTipoPassagemVenda((String) rset.getObject("SIGLA_TIPO_PASSAGEM_VENDA"));
					bean.setSiglaTipoPassagemRemarcado((String) rset.getObject("SIGLA_TIPO_PASSAGEM_REMARCADO"));
					bean.setTipoVenda((String) rset.getObject("TIPO_VENDA")); 
					bean.setTipoDocumentoRemarcado((String) rset.getObject("TIPO_DOCUMENTO_REMARCADO")); 
					bean.setTipoDocumentoVenda((String) rset.getObject("TIPO_DOCUMENTO_VENDA"));
					bean.setCcfRemarcado((String) rset.getObject("CCF_REMARCADO")); 
					bean.setCcfVenda((String) rset.getObject("CCF_VENDA")); 
					bean.setEmpresaRemarcado((String) rset.getObject("EMPRESA_REMARCADO")); 
					bean.setEmpresaVenda((String) rset.getObject("EMPRESA_VENDA")); 
					bean.setAssentoVenda((String) rset.getObject("ASSENTO_VENDA"));
					bean.setAssentoRemarcado((String) rset.getObject("ASSENTO_REMARCADO"));
					bean.setDataViagem((Date) rset.getObject("DATA_VIAGEM"));
					bean.setDataViagemRemarcado((Date) rset.getObject("DATA_VIAGEM_REMARCADO"));
					bean.setBilheteVenda((String) rset.getObject("BILHETE_VENDA"));
					bean.setMulta((BigDecimal) new BigDecimal(rset.getObject("MULTA") == null ? "0" : rset.getObject("MULTA").toString()));
					bean.setCodOrigemVenda((String) rset.getObject("COD_ORIGEM_VENDA"));
					bean.setCodDestinoVenda((String) rset.getObject("COD_DESTINO_VENDA"));
					bean.setDescOrigemVenda((String) rset.getObject("DESC_ORIGEM_VENDA"));
					bean.setDescDestinoVenda((String) rset.getObject("DESC_DESTINO_VENDA"));
					
					bean.setCodOrigemRemarcado((String) rset.getObject("COD_ORIGEM_REMARCADO"));
					bean.setCodDestinoRemarcado((String) rset.getObject("COD_DESTINO_REMARCADO"));
					bean.setDescOrigemRemarcado((String) rset.getObject("DESC_ORIGEM_REMARCADO"));
					bean.setDescDestinoRemarcado((String) rset.getObject("DESC_DESTINO_REMARCADO"));
					
					bean.setDataRemarcacao((Date) rset.getObject("DATA_REMARCACAO"));
					bean.setDataVenda((Date) rset.getObject("DATA_VENDA"));
					bean.setPedagioVenda((BigDecimal) rset.getObject("PEDAGIO_VENDA"));
					bean.setSeguroVenda((BigDecimal) rset.getObject("SEGURO_VENDA"));
					bean.setTarifaVenda((BigDecimal) rset.getObject("TARIFA_VENDA"));
					bean.setTaxaEmbarqueVenda((BigDecimal) rset.getObject("TAXA_EMBARQUE_VENDA"));
					bean.setPedagioRemarcado((BigDecimal) rset.getObject("PEDAGIO_REMARCADO"));
					bean.setSeguroRemarcado((BigDecimal) rset.getObject("SEGURO_REMARCADO"));
					bean.setServicoVenda((BigDecimal) rset.getObject("SERVICO_VENDA"));
					bean.setTarifaRemarcado((BigDecimal) rset.getObject("TARIFA_REMARCADO"));
					bean.setTaxaEmbarqueRemarcado((BigDecimal) rset.getObject("TAXA_EMBARQUE_REMARCADO"));
					bean.setClienteVenda((String) rset.getObject("CLIENTE_VENDA"));
					bean.setClienteRemarcado((String) rset.getObject("CLIENTE_REMARCADO"));
					bean.setAgenciaVenda((String) rset.getObject("AGENCIA_VENDA"));
					bean.setAgenciaRemarcado((String) rset.getObject("AGENCIA_REMARCADO")); 
					bean.setBilheteRemarcado((String) rset.getObject("BILHETE_REMARCADO")); 
					bean.setFormaPagamentoVenda((String) rset.getObject("FORMA_PAGO_VENDA")); 
					bean.setBilheteiroVenda((String) rset.getObject("BILHETEIRO_VENDA"));
					bean.setBilheteiroRemarcado((String) rset.getObject("BILHETEIRO_REMARCADO"));
					bean.setDocumentoRemarcado((String) rset.getObject("DOCUMENTO_REMARCADO"));
					bean.setDocumentoVenda((String) rset.getObject("DOCUMENTO_VENDA"));
					bean.setLinhaRemarcado((String) rset.getObject("LINHA_REMARCADO"));
					bean.setLinhaVenda((String) rset.getObject("LINHA_VENDA"));
					bean.setServicoRemarcado((BigDecimal) rset.getObject("SERVICO_REMARCADO"));
					bean.setTipoPassagemVenda((String) rset.getObject("TIPO_PASSAGEM_VENDA"));
					bean.setTipoPassagemRemarcado((String) rset.getObject("TIPO_PASSAGEM_REMARCADO"));
					bean.setDiferenca(bean.getTarifaVenda() == null ? new BigDecimal("0") : bean.getTarifaVenda().subtract(bean.getMulta()));
					bean.setValorTotalVenda((BigDecimal) rset.getObject("VALOR_TOTAL_VENDA"));
					bean.setValorTotalRemarcado((BigDecimal) rset.getObject("VALOR_TOTAL_REMARCADO"));
					bean.setPercentualDescontoVenda((BigDecimal) rset.getObject("PERCENTUAL_DESCONTO_VENDA"));
					bean.setPercentualDescontoRemarcado((BigDecimal) rset.getObject("PERCENTUAL_DESCONTO_REMARCADO"));
					bean.setValorPassagemVenda((BigDecimal) rset.getObject("VALOR_PASSAGEM_VENDA"));
					bean.setValorPassagemRemarcado((BigDecimal) rset.getObject("VALOR_PASSAGEM_REMARCADO"));
					bean.setTppVenda((BigDecimal) rset.getObject("TPP_VENDA"));
					bean.setTppRemarcado((BigDecimal) rset.getObject("TPP_REMARCADO"));
					
					lsDadosRelatorio.add(bean);
				}

				if (lsDadosRelatorio.size() > 0) {
					setLsDadosRelatorio(lsDadosRelatorio);

				}
			}
		});

	}

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

	@Override
	protected void processaParametros() throws Exception {

	}

	private String getSql(Integer empresaId, String puntoVentasId, Boolean considerarAmbos, Boolean considerarApenasReativo, 
			Boolean considerarApenasTransferencia) {
		
		

		StringBuilder sql = new StringBuilder();
		
		sql.append("SELECT DISTINCT original.DESCTIPODOC TIPO_DOCUMENTO_REMARCADO,remarcado.DESCTIPODOC TIPO_DOCUMENTO_VENDA, r2.CCF CCF_REMARCADO, r2r.CCF CCF_VENDA, E.NOMBEMPRESA EMPRESA_REMARCADO,EV.NOMBEMPRESA EMPRESA_VENDA, ");
		sql.append("       case when tp.tipoventa_id = 73 then 'VENDA EXTRAVIADA' WHEN tp.tipoventa_id in(5,12,18,41,49,81)  then 'PTA' WHEN tp.tipoventa_id = 82  then 'CONFIRM.EM ABERT' ELSE tp.DESCTIPOVENTA END TIPO_VENDA, " );
		sql.append("       cao.DESCCATEGORIA TIPO_PASSAGEM_VENDA, car.DESCCATEGORIA TIPO_PASSAGEM_REMARCADO, ");
		sql.append("       cao.CVECATEGORIA SIGLA_TIPO_PASSAGEM_VENDA, ");
		sql.append("       car.CVECATEGORIA SIGLA_TIPO_PASSAGEM_REMARCADO, ");
		sql.append("       rr.DESCRUTA LINHA_REMARCADO, ");
		sql.append("       ro.DESCRUTA LINHA_VENDA, ");
		sql.append("       ORIGEM.CVEPARADA COD_ORIGEM_VENDA, ");
		sql.append("       DESTINO.CVEPARADA COD_DESTINO_VENDA, ");
		sql.append("       ORIGEM.DESCPARADA DESC_ORIGEM_VENDA, ");
		sql.append("       DESTINO.DESCPARADA DESC_DESTINO_VENDA, ");
		sql.append("       po.CVEPARADA COD_ORIGEM_REMARCADO, ");
		sql.append("       pd.CVEPARADA COD_DESTINO_REMARCADO, ");
		sql.append("       po.DESCPARADA DESC_ORIGEM_REMARCADO, ");
		sql.append("       pd.DESCPARADA DESC_DESTINO_REMARCADO, "); 
		sql.append("       original.IMPORTETPP TPP_VENDA, ");
		sql.append("       remarcado.IMPORTETPP TPP_REMARCADO, ");
		sql.append("       original.NOMBPASAJERO, ");
		sql.append("       remarcado.NOMBPASAJERO, ");
		sql.append("       remarcado.NUMFOLIOSISTEMA BILHETE_REMARCADO, ");
		sql.append("       remarcado.FECHORVIAJE DATA_VIAGEM_REMARCADO, ");
		sql.append("       remarcado.NUMASIENTO ASSENTO_REMARCADO, ");
		sql.append("       original.NUMASIENTO ASSENTO_VENDA, ");
		sql.append("       original.NUMFOLIOSISTEMA BILHETE_VENDA, ");
		sql.append("       original.FECHORVIAJE DATA_VIAGEM, ");
		sql.append("       original.PRECIOBASE TARIFA_VENDA, ");
		sql.append("       original.PRECIOPRICING DESCONTO_VENDA, ");
		sql.append("       original.PRECIOPAGADO VALOR_PASSAGEM_VENDA, ");
		sql.append("       remarcado.PRECIOPAGADO VALOR_PASSAGEM_REMARCADO, ");
		sql.append("       remarcado.PRECIOBASE TARIFA_REMARCADO, ");
		sql.append("       original.IMPORTETAXAEMBARQUE TAXA_EMBARQUE_VENDA, ");
		sql.append("       remarcado.IMPORTETAXAEMBARQUE TAXA_EMBARQUE_REMARCADO, ");
		sql.append("       original.IMPORTESEGURO SEGURO_VENDA, ");
		sql.append("       remarcado.IMPORTESEGURO SEGURO_REMARCADO, ");
		sql.append("       original.IMPORTEPEDAGIO PEDAGIO_VENDA, ");
		sql.append("       remarcado.IMPORTEPEDAGIO PEDAGIO_REMARCADO, ");
		sql.append("       original.NOMBPASAJERO CLIENTE_VENDA, ");
		sql.append("       remarcado.NOMBPASAJERO CLIENTE_REMARCADO, ");
		sql.append("       remarcado.DESCNUMDOC DOCUMENTO_REMARCADO, ");
		sql.append("       original.DESCNUMDOC DOCUMENTO_VENDA, ");
		sql.append("       original.CORRIDA_ID SERVICO_VENDA, ");
		sql.append("       remarcado.CORRIDA_ID SERVICO_REMARCADO, ");
		sql.append("       FP.DESCPAGO FORMA_PAGO_VENDA, ");
		sql.append("       remarcado.FECHORVENTA DATA_REMARCACAO, ");
		sql.append("       original.FECHORVENTA DATA_VENDA, ");
		sql.append("       PTV.NOMBPUNTOVENTA AGENCIA_VENDA, ");
		sql.append("       PTR.NOMBPUNTOVENTA AGENCIA_REMARCADO, "); 
		sql.append("       UV.NOMBUSUARIO BILHETEIRO_VENDA, "); 
		sql.append("       UR.NOMBUSUARIO BILHETEIRO_REMARCADO, "); 
		sql.append("	   COALESCE(eventoExtra.IMPINGRESO,0) as multa, ");
		sql.append("	  (select sum(BFPV.importe) from BOLETO_FORMAPAGO BFPV where BFPV.boleto_id = original.boleto_id and BFPV.activo = 1) as VALOR_TOTAL_VENDA, ");
		sql.append("	  (select sum(BFPR.importe) from BOLETO_FORMAPAGO BFPR where BFPR.boleto_id = remarcado.boleto_id and BFPR.activo = 1) as VALOR_TOTAL_REMARCADO, ");
		sql.append("	   case when original.PRECIOBASE > 0 then TRUNC(((100 - (original.PRECIOPAGADO * 100) / original.PRECIOBASE)),2) else 0 end as PERCENTUAL_DESCONTO_VENDA, ");
		sql.append("	   case when remarcado.PRECIOBASE > 0 then TRUNC(((100 - (remarcado.PRECIOPAGADO * 100) / remarcado.PRECIOBASE)),2) else 0 end as PERCENTUAL_DESCONTO_REMARCADO ");
		sql.append("FROM BOLETO remarcado ");
		sql.append("INNER JOIN BOLETO original ON (remarcado.boletoanterior_id = original.boleto_id "); 
		sql.append("                               AND original.INDCANCELACION = 1) ");
		sql.append("INNER JOIN PARADA ORIGEM ON ORIGEM.PARADA_ID = original.ORIGEN_ID ");
		sql.append("INNER JOIN PARADA DESTINO ON DESTINO.PARADA_ID = original.DESTINO_ID ");
		sql.append("INNER JOIN PARADA po ON po.PARADA_ID = remarcado.ORIGEN_ID ");
		sql.append("INNER JOIN PARADA pd ON pd.PARADA_ID = remarcado.DESTINO_ID ");
		sql.append("INNER JOIN BOLETO_FORMAPAGO BFP ON original.BOLETO_ID = BFP.BOLETO_ID ");
		sql.append("INNER JOIN FORMA_PAGO FP ON BFP.FORMAPAGO_ID = FP.FORMAPAGO_ID "); 
		sql.append("INNER JOIN PUNTO_VENTA PTV ON PTV.PUNTOVENTA_ID = original.PUNTOVENTA_ID ");
		sql.append("INNER JOIN PUNTO_VENTA PTR ON PTR.PUNTOVENTA_ID = remarcado.PUNTOVENTA_ID ");
		sql.append("INNER JOIN USUARIO UV ON original.USUARIO_ID = UV.USUARIO_ID ");
		sql.append("INNER JOIN EMPRESA E ON remarcado.EMPRESACORRIDA_ID = E.EMPRESA_ID ");
		sql.append("INNER JOIN EMPRESA EV ON original.EMPRESACORRIDA_ID = EV.EMPRESA_ID ");
		sql.append("INNER JOIN RUTA rr ON remarcado.RUTA_ID = rr.RUTA_ID ");
		sql.append("INNER JOIN RUTA ro ON original.RUTA_ID = ro.RUTA_ID ");
		sql.append("LEFT JOIN EVENTO_EXTRA eventoExtra ON eventoExtra.BOLETO_ID   = remarcado.BOLETO_ID ");
		sql.append("LEFT JOIN FISCAL_R4 r4 ON r4.BOLETO_ID = remarcado.BOLETO_ID  ");
		sql.append("LEFT JOIN FISCAL_R2 r2 ON (r4.NUMSERIE20 = r2.NUMSERIE20 and r4.DATAMOV = r2.DATAMOV)  ");
		sql.append("LEFT JOIN FISCAL_R4 r4r ON r4r.BOLETO_ID = original.BOLETO_ID  ");
		sql.append("LEFT JOIN FISCAL_R2 r2r ON (r4r.NUMSERIE20 = r2r.NUMSERIE20 and r4r.DATAMOV = r2r.DATAMOV)  ");
		sql.append("inner JOIN USUARIO UR ON remarcado.USUARIO_ID = UR.USUARIO_ID ");
		sql.append("inner JOIN TIPO_VENTA tp ON original.TIPOVENTA_ID = tp.TIPOVENTA_ID ");
		sql.append("inner JOIN CATEGORIA cao ON original.CATEGORIA_ID = cao.CATEGORIA_ID ");
		sql.append("inner JOIN CATEGORIA car ON remarcado.CATEGORIA_ID = car.CATEGORIA_ID ");
		if (considerarApenasTransferencia) {
			  sql.append("WHERE remarcado.TIPOVENTA_ID IN (81) ");
		}else if (considerarApenasReativo) {
			  sql.append("WHERE remarcado.TIPOVENTA_ID IN (41) ");
		}else {
	       sql.append("WHERE remarcado.TIPOVENTA_ID IN (81, 41) ");
		}   
		sql.append("AND to_date(remarcado.FECHORVENTA,'DD/MM/YY') BETWEEN :DATA_INICIAL AND :DATA_FINAL ");
		sql.append(empresaId == null ||  empresaId.equals("-1") ? "" : "  AND original.EMPRESACORRIDA_ID= " + empresaId + " ");
		sql.append(puntoVentasId == null || puntoVentasId.equals("-1") ? "" : "   AND original.PUNTOVENTA_ID in(" + puntoVentasId + ") ");

		return sql.toString();
	}
	
}
