package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.ArrayCustomDataSourceRelatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.gui.controladores.relatorios.integracaoantifraude.EStatusKonduto;
import com.rjconsultores.ventaboletos.web.gui.controladores.relatorios.integracaoantifraude.EStatusKondutoEnvio;
import com.rjconsultores.ventaboletos.web.gui.controladores.relatorios.integracaoantifraude.EStatusKondutoTotalBus;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

public class RelatorioIntegracaoAntiFraude extends Relatorio {
	
	public static final String STATUSKONDUTOTOTALBUS_ID = "statusKondutoTotalBusId";
	public static final String EMPRESA_ID = "empresaId";
	public static final String PUNTOVENTA_ID = "puntoventaId";
	public static final String STATUSKONDUTO_ID = "statusKondutoId";
	public static final String STATUSKONDUTOENVIO_ID = "statusKondutoEnvioId";

	public RelatorioIntegracaoAntiFraude(Map<String, Object> parametros, Connection conexao) {
		super(parametros, conexao);
	}

	@Override
	protected void processaParametros() throws Exception {
		setCustomDataSource(new ArrayCustomDataSource(this));
	}

	private final class ArrayCustomDataSource extends ArrayCustomDataSourceRelatorio {

		public ArrayCustomDataSource(Relatorio relatorio) throws Exception {
			super(relatorio);
		}

		@Override
		protected void getSql(StringBuilder instrucaoSql, Map<String, Object> parametros) {
			instrucaoSql.append("SELECT TK.KONDUTO_ID ID_KONDUTO, ");
			instrucaoSql.append("LPAD(CASE WHEN CLI.TIPOIDENTIFICAUNO_ID = 2 THEN ");
			instrucaoSql.append("    NUMIDENTIFICAUNO ");
			instrucaoSql.append("WHEN CLI.TIPOIDENTIFICADOS_ID = 2 THEN ");
			instrucaoSql.append("    NUMIDENTIFICADOS  ");
			instrucaoSql.append("END, 11, '0') CPF_COMPRADOR, CLI.NOMBCLIENTE NOME_COMPRADOR, ");
			instrucaoSql.append("TO_CHAR(TK.DATA_VENDA,'DD/MM/YYYY') DATA_COMPRA, ");
			instrucaoSql.append("TO_CHAR(TK.DATA_VENDA,'HH24:MI') HORA_COMPRA, ");
			instrucaoSql.append("TKFP.NSU, TKFP.NUMAUTORIZACION AUTORIZACAO, ");
			instrucaoSql.append("COALESCE(B.PRECIOPAGADO,0) + COALESCE(B.IMPORTETAXAEMBARQUE,0) +  ");
			instrucaoSql.append("COALESCE(B.IMPORTESEGURO,0) + COALESCE(B.IMPORTEPEDAGIO,0) + COALESCE(B.IMPORTEOUTROS,0) AS VALOR_TOTAL, ");
			instrucaoSql.append("TK.NUMSERVICO SERVICO, ");
			instrucaoSql.append("TO_CHAR(TK.DATASERVICO, 'DD/MM/YYYY') DATA_VIAGEM,  ");
			instrucaoSql.append("TO_CHAR(TK.DATASERVICO, 'HH24:MI') HORA_VIAGEM,  ");
			instrucaoSql.append("ORI.DESCPARADA ORIGEM, DES.DESCPARADA DESTINO, ");
			instrucaoSql.append("B.NUMFOLIOSISTEMA BILHETE, ");
			instrucaoSql.append("B.NUMASIENTO POLTRONA, ");
			instrucaoSql.append("TKP.NOMBPASAJERO PASSAGEIRO, ");
			instrucaoSql.append("TK.STATUSTRANSACAOKONDUTO STATUSTRANSACAOKONDUTO, ");
			instrucaoSql.append("TK.STATUSTRANSACAO STATUSTRANSACAO, ");
			instrucaoSql.append("TK.TENTATIVAENVIO TENTATIVAENVIO, ");
			instrucaoSql.append("TK.STATUSENVIO STATUSENVIO, ");
			instrucaoSql.append("E.NOMBEMPRESA NOMBEMPRESA, ");
			instrucaoSql.append("PV.NOMBPUNTOVENTA NOMBPUNTOVENTA, ");
			instrucaoSql.append("TO_CHAR(TK.DATA_ENVIO, 'DD/MM/YYYY') DATA_ENVIO,  ");
			instrucaoSql.append("TO_CHAR(TK.DATA_ENVIO, 'HH24:MI') HORA_ENVIO,  ");
			instrucaoSql.append("TKFP.VALOR VALOR, ");
			instrucaoSql.append("TK.CODIGO_HTTP CODIGO_HTTP, ");
			instrucaoSql.append("TKFP.TIPO ");
			instrucaoSql.append("FROM TRANSACAO_KONDUTO TK ");
			instrucaoSql.append("JOIN TK_FORMAPAGO TKFP ON TKFP.TRANSACAOKONDUTO_ID = TK.TRANSACAOKONDUTO_ID ");
			instrucaoSql.append("JOIN TK_PASSAGEIRO TKP ON TKP.TRANSACAOKONDUTO_ID = TK.TRANSACAOKONDUTO_ID ");
			instrucaoSql.append("LEFT JOIN BOLETO B ON B.BOLETO_ID = TKP.BOLETO_ID ");
			instrucaoSql.append("LEFT JOIN EMPRESA E ON E.EMPRESA_ID = TK.EMPRESA_ID ");
			instrucaoSql.append("LEFT JOIN PUNTO_VENTA PV ON PV.PUNTOVENTA_ID = TK.PUNTOVENTA_ID ");
			instrucaoSql.append("LEFT JOIN CLIENTE CLI ON TK.CLIENTE_ID = CLI.CLIENTE_ID ");
			instrucaoSql.append("LEFT JOIN PARADA ORI ON ORI.PARADA_ID = TK.PARADA_ID ");
			instrucaoSql.append("LEFT JOIN PARADA DES ON DES.PARADA_ID = TK.PARADA_ID_DESTINO ");
			instrucaoSql.append("LEFT JOIN PARADA ORIV ON ORIV.PARADA_ID = TK.PARADA_ID_VOLTA ");
			instrucaoSql.append("LEFT JOIN PARADA DESV ON DESV.PARADA_ID = TK.PARADA_ID_DESTINO_VOLTA ");
			instrucaoSql.append("WHERE TK.DATA_VENDA BETWEEN :dtInicial AND :dtFinal ");
			
			if (parametros.get(STATUSKONDUTOTOTALBUS_ID) != null && StringUtils.isNotBlank(parametros.get(STATUSKONDUTOTOTALBUS_ID).toString())) {
				instrucaoSql.append("AND TK.STATUSTRANSACAO IN(" + parametros.get(STATUSKONDUTOTOTALBUS_ID).toString() + ") ");
			}

			if (parametros.get(EMPRESA_ID) != null && StringUtils.isNotBlank(parametros.get(EMPRESA_ID).toString())) {
				instrucaoSql.append("AND TK.EMPRESA_ID  IN (" + parametros.get(EMPRESA_ID) + ") ");
			}

			if (parametros.get(PUNTOVENTA_ID) != null && StringUtils.isNotBlank(parametros.get(PUNTOVENTA_ID).toString())) {
				instrucaoSql.append("AND TK.PUNTOVENTA_ID IN (" + parametros.get(PUNTOVENTA_ID) + ")");
			}

			if (parametros.get(STATUSKONDUTO_ID) != null && StringUtils.isNotBlank(parametros.get(STATUSKONDUTO_ID).toString())) {
				instrucaoSql.append("AND (TK.STATUSTRANSACAOKONDUTO IN(" + parametros.get(STATUSKONDUTO_ID).toString() + ") OR TK.STATUSTRANSACAOKONDUTO IS NULL)");
			}

			if (parametros.get(STATUSKONDUTOENVIO_ID) != null) {
				instrucaoSql.append("AND TK.STATUSENVIO IN(" + parametros.get(STATUSKONDUTOENVIO_ID).toString() + ") ");
			}
			
			instrucaoSql.append(" ORDER BY TK.DATA_VENDA, TK.KONDUTO_ID ");
		}

		@Override
		protected void populaValoresDataResult(Map<String, Object> dataResult, ResultSet resultSet) throws SQLException {
			dataResult.put("ID_KONDUTO", resultSet.getString("ID_KONDUTO"));
			dataResult.put("CPF_COMPRADOR", resultSet.getString("CPF_COMPRADOR"));
			dataResult.put("NOME_COMPRADOR", resultSet.getString("NOME_COMPRADOR"));
			dataResult.put("DATA_COMPRA", resultSet.getString("DATA_COMPRA"));
			dataResult.put("HORA_COMPRA", resultSet.getString("HORA_COMPRA"));
			dataResult.put("NSU", resultSet.getString("NSU"));
			dataResult.put("AUTORIZACAO", resultSet.getString("AUTORIZACAO"));
			dataResult.put("VALOR_TOTAL", resultSet.getBigDecimal("VALOR_TOTAL"));
			dataResult.put("VALOR", resultSet.getBigDecimal("VALOR"));
			dataResult.put("SERVICO", resultSet.getString("SERVICO"));
			dataResult.put("DATA_VIAGEM", resultSet.getString("DATA_VIAGEM"));
			dataResult.put("HORA_VIAGEM", resultSet.getString("HORA_VIAGEM"));
			dataResult.put("ORIGEM", resultSet.getString("ORIGEM"));
			dataResult.put("DESTINO", resultSet.getString("DESTINO"));
			dataResult.put("BILHETE", resultSet.getString("BILHETE"));
			dataResult.put("POLTRONA", resultSet.getString("POLTRONA"));
			dataResult.put("PASSAGEIRO", resultSet.getString("PASSAGEIRO"));
			dataResult.put("TENTATIVAENVIO", resultSet.getInt("TENTATIVAENVIO"));
			dataResult.put("NOMBEMPRESA", resultSet.getString("NOMBEMPRESA"));
			dataResult.put("NOMBPUNTOVENTA", resultSet.getString("NOMBPUNTOVENTA"));
			dataResult.put("DATA_ENVIO", resultSet.getString("DATA_ENVIO"));
			dataResult.put("HORA_ENVIO", resultSet.getString("HORA_ENVIO"));
			dataResult.put("CODIGO_HTTP", resultSet.getString("CODIGO_HTTP"));
			dataResult.put("TIPO", resultSet.getString("TIPO"));

			String statustransacao = resultSet.getString("STATUSTRANSACAO");
			if (StringUtils.isNotBlank(statustransacao)) {
				dataResult.put("STATUSTRANSACAO", EStatusKondutoTotalBus.getStatusKondutoPorId(statustransacao).getDescricao());
			}

			String statustransacaoKonduto = resultSet.getString("STATUSTRANSACAOKONDUTO");
			if (StringUtils.isNotBlank(statustransacaoKonduto)) {
				dataResult.put("STATUSTRANSACAOKONDUTO", EStatusKonduto.getStatusKondutoPorId(statustransacaoKonduto).getDescricao());
			}

			String statusEnvio = resultSet.getString("STATUSENVIO");
			if (StringUtils.isNotBlank(statusEnvio)) {
				dataResult.put("STATUSENVIO", EStatusKondutoEnvio.getStatusKondutoPorId(statusEnvio).getDescricao());
			}
		}

		@Override
		protected void configuraParametrosConsultaSql(Map<String, Object> parametros, NamedParameterStatement stmt) throws SQLException {
			stmt.setTimestamp("dtInicial", new Timestamp(DateUtil.inicioFecha((Date) parametros.get("dtInicial")).getTime()));
			stmt.setTimestamp("dtFinal", new Timestamp(DateUtil.fimFecha((Date) parametros.get("dtFinal")).getTime()));
		}

	}
}
