/**
 * 
 */
package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Timestamp;
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;

/**
 * @author Bruno Neves
 *
 */
public class RelatorioCancelamentoAutomaticoECF extends Relatorio {


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

		this.setCustomDataSource(new ArrayDataSource(this) {
			@Override
			public void initDados() throws Exception {

				Connection conexao = this.relatorio.getConexao();
				Map<String, Object> parametros = this.relatorio.getParametros();
				
				NamedParameterStatement stmt = new NamedParameterStatement(conexao, getSql(parametros) );
				
				NamedParameterStatement stmtComplemento = new NamedParameterStatement(conexao, montaSqlComplementar() );
				
				stmt.setInt("CANCELAMENTOECF", Integer.valueOf(parametros.get("CANCELAMENTOECF").toString()));
				
				if(parametros.get("EMPRESA_ID") != null){
					stmt.setInt("EMPRESA_ID", Integer.valueOf(parametros.get("EMPRESA_ID").toString()));
				}
				
				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()));
				
				if(parametros.get("TIPOPUNTOVENTA_ID") != null && !parametros.get("TIPOPUNTOVENTA_ID").toString().equals("-1") ){
					stmt.setInt("TIPOPUNTOVENTA_ID", Integer.valueOf(parametros.get("TIPOPUNTOVENTA_ID").toString()));
				}
				
				ResultSet rset = stmt.executeQuery();

				while (rset.next()) {

					Map<String, Object> dataResult = new HashMap<String, Object>();
					
					dataResult.put("empresa", rset.getString("empresa"));
					dataResult.put("agencia", rset.getString("agencia"));
					dataResult.put("bilheteiro", rset.getString("bilheteiro"));
					dataResult.put("bilheteiroNome", rset.getString("bilheteiroNome"));
					dataResult.put("dataHoraMD", (Date)rset.getObject("dataHoraMD"));
					dataResult.put("dataServico", (Date)rset.getObject("dataServico"));
					dataResult.put("servico", rset.getString("servico"));
					dataResult.put("codLinha", rset.getString("codLinha"));
					dataResult.put("linha", rset.getString("linha"));
					dataResult.put("horaServico", (Date)rset.getObject("horaServico"));
					dataResult.put("codOrigem", rset.getString("codOrigem"));
					dataResult.put("origem", rset.getString("origem"));
					dataResult.put("codDestino", rset.getString("codDestino"));
					dataResult.put("destino", rset.getString("destino"));
					dataResult.put("poltronas", rset.getString("poltronas"));
					dataResult.put("ECF", rset.getString("ECF"));
					dataResult.put("bilhete", rset.getString("bilhete"));
					dataResult.put("CCF", rset.getString("CCF"));
					dataResult.put("tipoVenda", rset.getString("tipoVenda"));
					dataResult.put("siglaTipoPassagem", rset.getString("siglaTipoPassagem"));
					dataResult.put("tipoPassagem", rset.getString("tipoPassagem"));
					dataResult.put("valorPassagem", rset.getBigDecimal("valorPassagem"));
					dataResult.put("percentual", rset.getBigDecimal("percentual"));
					dataResult.put("valorTotal", rset.getBigDecimal("valorTotal"));
					dataResult.put("tarifa", rset.getBigDecimal("tarifa"));				
					dataResult.put("pedagio", rset.getBigDecimal("pedagio"));
					dataResult.put("seguro", rset.getBigDecimal("seguro"));
					dataResult.put("UTR", rset.getBigDecimal("UTR"));
					dataResult.put("TPP", rset.getString("TPP"));
					
					stmtComplemento.setString("cajaId", rset.getString("cajaId") );
					ResultSet rsetComplemento = stmtComplemento.executeQuery();
					
					for (int i = 1; i < 4; i++) {
						if( rsetComplemento.next() ) {
							dataResult.put("formaPagamento"+i, rsetComplemento.getString("formaPagamento"));
							dataResult.put("nsu"+i, rsetComplemento.getString("nsu"));
						}else {
							dataResult.put("formaPagamento"+i, null);
							dataResult.put("nsu"+i, null);
						}
					}

					this.dados.add(dataResult);

				}

				this.resultSet = rset;
			}

		});
	}
	
	private String getSql(Map<String, Object> parametros) {
		StringBuilder sql = new StringBuilder(3200);
		
		sql.append(" SELECT  ");
		sql.append("    e.NOMBEMPRESA AS empresa,  ");
		sql.append("    pv.NOMBPUNTOVENTA AS agencia , ");
		sql.append("    c.USUARIO_ID AS bilheteiro, ");
		sql.append("    UR.NOMBUSUARIO bilheteiroNome, ");
		sql.append("    c.FECHORVENTA_H as dataHoraMD, ");
		sql.append("    c.FECCORRIDA as dataServico,  ");
		sql.append("    c.CORRIDA_ID AS servico, ");
		sql.append("    c.RUTA_ID AS codLinha,   ");
		sql.append("    rr.DESCRUTA as linha, ");
		sql.append("    cor.FECHORSALIDA as horaServico, ");
		sql.append("    pOrigem.CVEPARADA AS codOrigem, ");
		sql.append("    pOrigem.DESCPARADA AS origem,  ");
		sql.append("    pDestino.CVEPARADA AS codDestino, ");
		sql.append("    pDestino.DESCPARADA AS destino,  ");
		sql.append("    c.NUMASIENTO AS poltronas,  ");
		sql.append("    r2.NUMSERIE20 AS ECF,  ");
		sql.append("    c.NUMFOLIOSISTEMA AS bilhete,  ");
		sql.append("    c.CCF AS CCF, ");
		sql.append("    tv.DESCTIPOVENTA AS tipoVenda, ");
		sql.append("    car.CVECATEGORIA AS siglaTipoPassagem, ");
		sql.append("    car.DESCCATEGORIA AS tipoPassagem, ");
		sql.append("    c.PRECIOBASE AS valorPassagem,  ");
		sql.append("    CASE ");
		sql.append("     WHEN c.PRECIOBASE > 0 ");
		sql.append("     THEN TRUNC(((100 - (c.PRECIOPAGADO * 100) / c.PRECIOBASE)),2) ");
		sql.append("     ELSE 0 ");
		sql.append("    END AS percentual, ");
		sql.append("    sum(cfp.importe) AS valorTotal,  ");
		sql.append("    c.PRECIOPAGADO AS tarifa,  ");
		sql.append("    c.IMPORTEPEDAGIO AS pedagio,  ");
		sql.append("    c.IMPORTESEGURO AS seguro, ");
		sql.append("    c.IMPORTETAXAEMBARQUE AS UTR, ");
		sql.append("    c.IMPORTETPP AS TPP, ");
		sql.append("    c.CAJA_ID AS cajaId ");
		sql.append(" FROM caja c  ");
		sql.append(" INNER JOIN FISCAL_R4 fr4  ");
		sql.append("   ON c.CAJA_ID = fr4.CAJA_ID  ");
		sql.append(" LEFT JOIN FISCAL_R2 r2 ");
		sql.append("   ON (fr4.NUMSERIE20 = r2.NUMSERIE20 ");
		sql.append("   AND fr4.DATAMOV    = r2.DATAMOV) ");
		sql.append(" INNER JOIN PARADA pOrigem  ");
		sql.append("   ON pOrigem.PARADA_ID = c.ORIGEN_ID  ");
		sql.append(" INNER JOIN PARADA pDestino  ");
		sql.append("   ON pDestino.PARADA_ID = c.DESTINO_ID  ");
		sql.append(" INNER JOIN CORRIDA cor ");
		sql.append("   ON cor.CORRIDA_ID = c.CORRIDA_ID ");
		sql.append("   and cor.FECCORRIDA = c.FECCORRIDA ");
		sql.append(" INNER JOIN PUNTO_VENTA pv ");
		sql.append("   on c.PUNTOVENTA_ID = pv.PUNTOVENTA_ID ");
		sql.append(" INNER JOIN RUTA rr ");
		sql.append("   ON c.RUTA_ID = rr.RUTA_ID ");
		sql.append(" INNER JOIN CLASE_SERVICIO cs  ");
		sql.append("   ON cs.CLASESERVICIO_ID  = c.CLASESERVICIO_ID  ");
		sql.append(" INNER JOIN EMPRESA e  ");
		sql.append("   ON e.EMPRESA_ID  = c.EMPRESACORRIDA_ID  ");
		sql.append(" INNER JOIN USUARIO UR ");
		sql.append("   ON c.USUARIO_ID = UR.USUARIO_ID ");
		sql.append(" INNER JOIN CATEGORIA car ");
		sql.append("   ON c.CATEGORIA_ID     = car.CATEGORIA_ID ");
		sql.append(" INNER JOIN TIPO_VENTA tv ");
		sql.append("   on c.TIPOVENTA_ID = tv.TIPOVENTA_ID ");
		sql.append(" INNER JOIN CAJA_FORMAPAGO cfp  ");
		sql.append("   ON cfp.CAJA_ID = c.CAJA_ID  ");
		sql.append(" LEFT JOIN TIPO_IDENTIFICACION tir ");
		sql.append("   ON (tir.TIPOIDENTIFICACION_ID = c.TIPOIDENTIFICACION_ID) ");
		sql.append(" WHERE ( fr4.INDCANCELAMENTO = 'S' ");
		sql.append("    OR c.MOTIVOCANCELACION_ID = :CANCELAMENTOECF ) ");
		sql.append("    and to_date(fr4.DATAMOV,'yyyyMMdd') >= :DATA_INICIAL");
		sql.append("    and to_date(fr4.DATAMOV,'yyyyMMdd') <= :DATA_FINAL ");
		
		if(parametros.get("EMPRESA_ID") != null){
			sql.append(" and c.EMPRESAPUNTOVENTA_ID = :EMPRESA_ID");
		}
		
		if (parametros.get("NUMPUNTOVENTA") != null) {
			sql.append(" and c.puntoventa_id IN (" + parametros.get("NUMPUNTOVENTA").toString() + ")");
		}
			
		sql.append("   group by e.NOMBEMPRESA, pv.NOMBPUNTOVENTA, c.USUARIO_ID, UR.NOMBUSUARIO, c.FECHORVENTA_H,  ");
		sql.append("         c.FECCORRIDA, c.CORRIDA_ID, c.RUTA_ID, rr.DESCRUTA, cor.FECHORSALIDA,  ");
		sql.append("         pOrigem.CVEPARADA, pOrigem.DESCPARADA, pDestino.CVEPARADA, pDestino.DESCPARADA, c.NUMASIENTO,  ");
		sql.append("         r2.NUMSERIE20, c.NUMFOLIOSISTEMA, c.CCF, tv.DESCTIPOVENTA, car.CVECATEGORIA,  ");
		sql.append("         car.DESCCATEGORIA, c.PRECIOBASE, c.PRECIOPAGADO, c.IMPORTEPEDAGIO,  ");
		sql.append("         c.IMPORTESEGURO, c.IMPORTETAXAEMBARQUE, c.IMPORTETPP, c.CAJA_ID ");
		sql.append(" ORDER BY empresa, agencia, bilheteiroNome ");
		
		return sql.toString();
	}
	
	private String montaSqlComplementar() {
		StringBuilder sql = new StringBuilder(400);
		
		sql.append(" SELECT ");
		sql.append("    ct.NSU, fp.DESCPAGO AS formaPagamento ");
		sql.append(" FROM CAJA_FORMAPAGO cfp  ");
		sql.append(" INNER JOIN FORMA_PAGO fp  ");
		sql.append("    ON fp.FORMAPAGO_ID = cfp.FORMAPAGO_ID  ");
		sql.append(" LEFT JOIN CAJA_DET_PAGO cdp  ");
		sql.append("    ON cdp.CAJAFORMAPAGO_ID = cfp.CAJAFORMAPAGO_ID  ");
		sql.append(" LEFT JOIN CAJA_TARJETA ct  ");
		sql.append("    ON ct.CAJADETPAGO_ID = cdp.CAJADETPAGO_ID ");
		sql.append(" where cfp.CAJA_ID = :cajaId ");
		sql.append("    and cfp.ACTIVO = 1 ");
		sql.append(" order by cfp.CAJAFORMAPAGO_ID ");
		
		return sql.toString();
	}

	@Override
	protected void processaParametros() throws Exception {

	}

}
