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.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) {

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

				stmt.setString("dataInicial", DateUtil.getStringDate( DateUtil.inicioFecha((Date) parametros.get("DATA_INICIAL")), "dd/MM/yyyy HH:mm"));
				stmt.setString("dataFinal", DateUtil.getStringDate( DateUtil.fimFecha((Date) parametros.get("DATA_FINAL")), "dd/MM/yyyy HH:mm"));
				
				if (parametros.get("EMPRESA_ID") != null) {
					stmt.setInt("empresaId", Integer.valueOf(parametros.get("EMPRESA_ID").toString()));
				}
				
				if (parametros.get("PUNTOVENTA_ID") != null) {
					stmt.setInt("puntoventaId", Integer.valueOf(parametros.get("PUNTOVENTA_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("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, COALESCE(BORIGINAL.FECHORVENTA, B.FECHORVENTA) AS DATACOMPRA, ")
		   .append("B.NUMFOLIOSISTEMA AS NUMEROPASSAGEM, COALESCE(BORIGINAL.NUMOPERACION, 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(" AND B1.INDCANCELACION  = 0 ")
		   .append(") AS VALORTOTALCOMPRA, ")
		   .append("VALOR_TARJETA AS VALORASERRESTITUIDO ")
		   .append("FROM BOLETO B ")
		   .append("LEFT JOIN BOLETO BORIGINAL ON BORIGINAL.BOLETO_ID = B.BOLETOORIGINAL_ID ")
		   .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 TO_DATE(:dataInicial,'DD/MM/YYYY HH24:MI') AND TO_DATE(:dataFinal,'DD/MM/YYYY HH24:MI') ");

		
		if (parametros.get("PUNTOVENTA_ID") != null) {
			sql.append(" AND ((B.PUNTOVENTA_ID = :puntoventaId  AND (B.PTOVTAVENTA_ID IS NULL OR B.PUNTOVENTA_ID = B.PTOVTAVENTA_ID)) OR B.PTOVTAVENTA_ID = :puntoventaId) ");
		} else {
			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("  AND (B.PTOVTAVENTA_ID IS NULL OR B.PUNTOVENTA_ID = B.PTOVTAVENTA_ID)) ")
				   .append(" OR B.PUNTOVENTA_ID = ")
				   .append(constante.getValorconstante())
				   .append(") ");
			}else{
				sql.append("AND OCD.INDPUNTOVENTAESTORNO = 1 ");
			}
		}

		if (parametros.get("EMPRESA_ID") != null) {
			sql.append(" AND E.EMPRESA_ID = :empresaId ");
		}

        return sql.toString();
	}

}
