package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

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

public class RelatorioBPeSubstituido extends Relatorio {

	public RelatorioBPeSubstituido(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(parametros);
				
				Date dtInicio = (Date) parametros.get("DATA_INICIO");
				Date dtFim = (Date) parametros.get("DATA_FIM");			

				NamedParameterStatement ps = new NamedParameterStatement(conexao, sql.toString());
				if(dtInicio != null && dtFim != null) {
					ps.setString("dataInicio", DateUtil.getStringDate(dtInicio, "dd/MM/yyyy") + " 00:00:00");
					ps.setString("dataFinal", DateUtil.getStringDate(dtFim, "dd/MM/yyyy") + " 23:59:59");
				}
				
				ps.setString("empresa_id", (String) parametros.get("EMPRESA_ID") );
				
				ResultSet rset = ps.executeQuery();

				while (rset.next()) {
					Map<String, Object> dataResult = new HashMap<String, Object>();

					dataResult.put("cod_origem_venda", rset.getString("cod_origem_venda"));
					dataResult.put("cod_destino_venda", rset.getString("cod_destino_venda"));
					dataResult.put("desc_origem_venda", rset.getString("desc_origem_venda"));
					dataResult.put("desc_destino_venda", rset.getString("desc_destino_venda"));
					dataResult.put("cod_origem_remarcado", rset.getString("cod_origem_remarcado"));
					dataResult.put("cod_destino_remarcado", rset.getString("cod_destino_remarcado"));
					dataResult.put("desc_origem_remarcado", rset.getString("desc_origem_remarcado"));
					dataResult.put("desc_destino_remarcado", rset.getString("desc_destino_remarcado"));
					dataResult.put("tpp_venda",	rset.getBigDecimal("tpp_venda"));
					dataResult.put("tpp_remarcado",	rset.getBigDecimal("tpp_remarcado"));
					dataResult.put("bilhete_venda",	rset.getString("bilhete_venda"));
					dataResult.put("bilhete_remarcado",	rset.getString("bilhete_remarcado"));
					dataResult.put("assento_venda",	rset.getString("assento_venda"));
					dataResult.put("assento_remarcado",	rset.getString("assento_remarcado"));
					dataResult.put("data_viagem", rset.getDate("data_viagem"));
					dataResult.put("data_viagem_remarcado",	rset.getDate("data_viagem_remarcado"));
					dataResult.put("tarifa_venda", rset.getBigDecimal("tarifa_venda"));
					dataResult.put("tarifa_remarcado", rset.getBigDecimal("tarifa_remarcado"));
					dataResult.put("desconto_venda", rset.getBigDecimal("desconto_venda"));
					dataResult.put("multa",	rset.getBigDecimal("multa"));
					dataResult.put("valor_passagem_venda", rset.getBigDecimal("valor_passagem_venda"));
					dataResult.put("valor_passagem_remarcado", rset.getBigDecimal("valor_passagem_remarcado"));
					dataResult.put("taxa_embarque_venda", rset.getBigDecimal("taxa_embarque_venda"));
					dataResult.put("taxa_embarque_remarcado", rset.getBigDecimal("taxa_embarque_remarcado"));
					dataResult.put("seguro_venda", rset.getBigDecimal("seguro_venda"));
					dataResult.put("seguro_remarcado", rset.getBigDecimal("seguro_remarcado"));
					dataResult.put("pedagio_venda",	rset.getBigDecimal("pedagio_venda"));
					dataResult.put("pedagio_remarcado",	rset.getBigDecimal("pedagio_remarcado"));
					dataResult.put("cliente_venda",	rset.getString("cliente_venda"));
					dataResult.put("cliente_remarcado",	rset.getString("cliente_remarcado"));
					dataResult.put("tipo_documento_venda", rset.getString("tipo_documento_venda"));
					dataResult.put("tipo_documento_remarcado", rset.getString("tipo_documento_remarcado"));
					dataResult.put("documento_venda", rset.getString("documento_venda"));
					dataResult.put("documento_remarcado", rset.getString("documento_remarcado"));
					dataResult.put("servico_venda",	rset.getString("servico_venda"));
					dataResult.put("servico_remarcado",	rset.getString("servico_remarcado"));
					dataResult.put("data_venda", rset.getDate("data_venda"));
					dataResult.put("data_remarcacao", rset.getDate("data_remarcacao"));
					dataResult.put("agencia_venda",	rset.getString("agencia_venda"));
					dataResult.put("agencia_remarcado",	rset.getString("agencia_remarcado"));
					dataResult.put("chbpe_original", rset.getString("chbpe_original"));
					dataResult.put("chbpe_remarcado", rset.getString("chbpe_remarcado"));
					dataResult.put("num_bpe_original", rset.getString("num_bpe_original"));
					dataResult.put("num_bpe_remarcado",	rset.getString("num_bpe_remarcado"));
					dataResult.put("numserie_original",	rset.getString("numserie_original"));
					dataResult.put("numserie_remarcado", rset.getString("numserie_remarcado"));
					dataResult.put("qrcode_original", rset.getString("qrcode_original"));
					dataResult.put("qrcode_remarcado", rset.getString("qrcode_remarcado"));					
					dataResult.put("valor_total_venda",	rset.getBigDecimal("valor_total_venda"));
					dataResult.put("valor_total_remarcado",	rset.getBigDecimal("valor_total_remarcado"));
				
					this.dados.add(dataResult);
				}

				this.resultSet = rset;
			}
		});
	}

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSql(Map<String, Object> parametros) {

		StringBuilder sql = new StringBuilder(1400);

		String estados = (String) parametros.get("ESTADOS_ID");
		String empresaId = (String) parametros.get("EMPRESA_ID");
		String puntoVentaId = (String) parametros.get("PUNTOVENTA_ID");
		
		sql.append(" SELECT ");
		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("     coalesce(original.importetpp, 0)           tpp_venda, ");
		sql.append("     coalesce(remarcado.importetpp, 0)          tpp_remarcado, ");
		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("     coalesce(original.preciobase, 0)           tarifa_venda, ");
		sql.append("     coalesce(original.preciopricing, 0)        desconto_venda, ");
		sql.append("     coalesce(original.preciopagado, 0)         valor_passagem_venda, ");
		sql.append("     coalesce(remarcado.preciopagado, 0)        valor_passagem_remarcado, ");
		sql.append("     coalesce(remarcado.preciobase, 0)          tarifa_remarcado, ");
		sql.append("     coalesce(original.importetaxaembarque, 0)  taxa_embarque_venda, ");
		sql.append("     coalesce(remarcado.importetaxaembarque, 0) taxa_embarque_remarcado, ");
		sql.append("     coalesce(original.importeseguro, 0)        seguro_venda, ");
		sql.append("     coalesce(remarcado.importeseguro, 0)       seguro_remarcado, ");
		sql.append("     coalesce(original.importepedagio, 0)       pedagio_venda, ");
		sql.append("     coalesce(remarcado.importepedagio, 0)      pedagio_remarcado, ");
		sql.append("     original.nombpasajero                      cliente_venda, ");
		sql.append("     remarcado.nombpasajero                     cliente_remarcado, ");
		sql.append("     original.desctipodoc                       tipo_documento_remarcado, ");
		sql.append("     remarcado.desctipodoc                      tipo_documento_venda, ");
		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("     remarcado.fechorventa                      data_remarcacao, ");
		sql.append("     original.fechorventa                       data_venda, ");
		sql.append("     ptv.nombpuntoventa                         agencia_venda, ");
		sql.append("     ptr.nombpuntoventa                         agencia_remarcado, ");
		sql.append("     bpe.chbpe                                  chbpe_original,  ");
		sql.append("     original.num_bpe                           num_bpe_original, ");
		sql.append("     original.numserie_bpe                      numserie_original, ");
		sql.append("     bpe.qrcode                                 qrcode_original, ");
		sql.append("     bper.chbpe                                 chbpe_remarcado, ");
		sql.append("     remarcado.num_bpe                          num_bpe_remarcado, ");
		sql.append("     coalesce(remarcado.numserie_bpe, '1')      numserie_remarcado, ");
		sql.append("     bper.qrcode                                qrcode_remarcado, ");
		sql.append("     ( select  ");
		sql.append("          SUM(coalesce(impingreso, 0)) ");
		sql.append("       FROM evento_extra ");
		sql.append("       WHERE boleto_id = remarcado.boleto_id ");
		sql.append("     ) AS multa, ");
		sql.append("     ( ");
		sql.append("         SELECT ");
		sql.append("             SUM(coalesce(bfpv.importe, 0)) ");
		sql.append("         FROM ");
		sql.append("             boleto_formapago bfpv ");
		sql.append("         WHERE ");
		sql.append("             bfpv.boleto_id = original.boleto_id ");
		sql.append("             AND bfpv.activo = 1 ");
		sql.append("     ) AS valor_total_venda, ");
		sql.append("     ( ");
		sql.append("         SELECT ");
		sql.append("             SUM(coalesce(bfpr.importe, 0)) ");
		sql.append("         FROM ");
		sql.append("             boleto_formapago bfpr ");
		sql.append("         WHERE ");
		sql.append("             bfpr.boleto_id = remarcado.boleto_id ");
		sql.append("             AND bfpr.activo = 1 ");
		sql.append("     ) AS valor_total_remarcado ");
		sql.append(" FROM ");
		sql.append("     bpe                          bpe ");
		sql.append("     INNER JOIN boleto            original ON original.boleto_id = bpe.boleto_id AND bpe.activo = 1 ");
		sql.append("     INNER JOIN BPE               bper on bper.bpesubstituicao_id = bpe.bpe_id and bper.activo = 1 ");
		sql.append("     INNER JOIN boleto            remarcado ON remarcado.boleto_id = bper.boleto_id ");
		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 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 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("      ");
		sql.append(" WHERE ");
		sql.append("     bpe.CODSTAT IN ('100', '102') ");
		sql.append("     AND bper.BPE_ID IS NOT NULL  ");
		
		if (empresaId != null) {
			sql.append("     AND original.empresacorrida_id = :empresa_id ");
		}
		
		if (puntoVentaId != null) {
			sql.append("     AND original.puntoventa_id IN ( " + puntoVentaId + " ) ");
		}
		
		if (estados != null) {
			sql.append(" AND bpe.uf IN ( " + estados + " )");
		}
		
		sql.append("     AND coalesce(original.fechorventa_h, original.fechorventa) >= to_date(:dataInicio, 'DD/MM/YYYY HH24:MI:SS') ");
		sql.append("     AND coalesce(original.fechorventa_h, original.fechorventa) <= to_date(:dataFinal, 'DD/MM/YYYY HH24:MI:SS') ");
		sql.append(" ORDER BY ");
		sql.append("     agencia_remarcado, data_remarcacao ");

		return sql.toString();
	}
}