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.entidad.Constante;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.ArrayDataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.ConstanteService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

public class RelatorioCancelamentoTransacao extends Relatorio {

	private ConstanteService constanteService;
	
	public RelatorioCancelamentoTransacao(Map<String, Object> parametros, Connection conexao, ConstanteService constanteService) throws Exception {
		super(parametros, conexao);
		this.constanteService = constanteService;

		this.setCustomDataSource(new ArrayDataSource(this) {

			public void initDados() throws Exception {
				Connection conexao = this.relatorio.getConexao();
				Map<String, Object> parametros = this.relatorio.getParametros();
				NamedParameterStatement stmt = new NamedParameterStatement(conexao, getSql());

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

				ResultSet rset = stmt.executeQuery();

				while (rset.next()) {
					Map<String, Object> dataResult = new HashMap<String, Object>();
				
					dataResult.put("empresa", rset.getString("empresa"));
					dataResult.put("dataSolicitacaoCliente", rset.getDate("dataSolicitacaoCliente"));
					dataResult.put("nomePassageiro", rset.getString("nomePassageiro"));
					dataResult.put("dataCompra", rset.getDate("dataCompra"));
					dataResult.put("numeroPassagem", rset.getString("numeroPassagem"));
					dataResult.put("localizador", rset.getString("localizador"));
					dataResult.put("dataViagem", rset.getTimestamp("dataViagem"));
					dataResult.put("servico", rset.getString("servico"));
					dataResult.put("assento", rset.getString("assento"));
					dataResult.put("valorTotalCompra", rset.getBigDecimal("valorTotalCompra"));
					dataResult.put("valorCompra", rset.getBigDecimal("valorCompra"));
					dataResult.put("valorASerRestituido", rset.getBigDecimal("valorASerRestituido"));
					
					this.dados.add(dataResult);
				}

				this.resultSet = rset;
			}
		});
	}

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSql() {
		StringBuilder sql = new StringBuilder();	
		
		sql.append("SELECT B.BOLETO_ID, OCD.FECINC AS DATASOLICITACAOCLIENTE, E.NOMBEMPRESA AS EMPRESA, B.NOMBPASAJERO AS NOMEPASSAGEIRO, B.FECHORVENTA AS DATACOMPRA, ")
		   .append("B.NUMFOLIOSISTEMA AS NUMEROPASSAGEM, B.NUMOPERACION AS LOCALIZADOR, B.FECHORVIAJE AS DATAVIAGEM, B.CORRIDA_ID AS SERVICO, B.NUMASIENTO AS ASSENTO, ")
		   .append("(COALESCE(B.PRECIOPAGADO,0) + COALESCE(B.IMPORTEOUTROS,0) + COALESCE(B.IMPORTEPEDAGIO,0) + COALESCE(B.IMPORTESEGURO,0) + COALESCE(B.IMPORTETAXAEMBARQUE,0)) AS VALORCOMPRA, ")
		   .append("( ")
		   .append(" SELECT SUM(COALESCE(B1.PRECIOPAGADO,0) + COALESCE(B1.IMPORTEOUTROS,0) + COALESCE(B1.IMPORTEPEDAGIO,0) + COALESCE(B1.IMPORTESEGURO,0) + COALESCE(B1.IMPORTETAXAEMBARQUE,0)) ")
		   .append(" FROM BOLETO B1 ")
		   .append(" WHERE B1.NUMOPERACION = B.NUMOPERACION ")
		   .append(") AS VALORTOTALCOMPRA, ")
		   .append("VALOR_TARJETA AS VALORASERRESTITUIDO ")
		   .append("FROM BOLETO B ")
		   .append("INNER JOIN OCD OCD ON OCD.BOLETO_ID = B.BOLETO_ID ")
		   .append("INNER JOIN MARCA M ON M.MARCA_ID = B.MARCA_ID ")
		   .append("INNER JOIN EMPRESA E ON E.EMPRESA_ID = M.EMPRESA_ID ")
		   .append("WHERE OCD.FECINC BETWEEN :dataInicial AND :dataFinal ");
		
		Constante constante = constanteService.buscarPorNomeConstante("PUNTO_VENTA_J3");
		if(constante != null 
				&& constante.getActivo() 
				&& constante.getValorconstante() != null
				&& !constante.getValorconstante().isEmpty()){
			sql.append("AND (B.PTOVTAVENTA_ID = ")
			   .append(constante.getValorconstante())
			   .append(" OR B.PUNTOVENTA_ID = ")
			   .append(constante.getValorconstante())
			   .append(") ");
		}else{
			sql.append("AND (B.PTOVTAVENTA_ID = 99999 ")
			   .append("OR B.PUNTOVENTA_ID = 99999) ");
		}
		
		if (parametros.get("EMPRESA_ID") != null) {
			sql.append(" AND E.EMPRESA_ID = " + parametros.get("EMPRESA_ID"));
		}
		
        return sql.toString();
	}

}
