package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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 RelatorioRemarcacaoDevolucao extends Relatorio {

	public RelatorioRemarcacaoDevolucao(Map<String, Object> parametros, Connection conexao, ConstanteService constanteService, final Boolean isRemarcacao) 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((Integer) parametros.get("EMPRESA_ID"), (String) parametros.get("NUMPUNTOVENTA"), isRemarcacao);

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);

				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()));

				ResultSet rset = stmt.executeQuery();

				List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();

				while (rset.next()) {
					Map<String, Object> dataResult = new HashMap<String, Object>();
					dataResult.put("dataRemarcacaoDevolucao", rset.getTimestamp("dataRemarcacaoDevolucao"));
					dataResult.put("dataVenta", rset.getTimestamp("dataVenta"));
					dataResult.put("origem", rset.getString("origem"));
					dataResult.put("destino", rset.getString("destino"));
					dataResult.put("agencia", rset.getString("agencia"));
					dataResult.put("linha", rset.getString("linha"));
					dataResult.put("servico", rset.getInt("servico"));
					dataResult.put("dataViagem", rset.getTimestamp("dataViagem"));
					if (isRemarcacao) {
						dataResult.put("dataViagemOriginal", rset.getTimestamp("dataViagemOriginal"));
					}
					dataResult.put("passageiro", rset.getString("passageiro"));
					dataResult.put("documento", rset.getString("documento"));
					dataResult.put("preco", rset.getBigDecimal("preco"));
					dataResult.put("multa", rset.getBigDecimal("multa"));

					data.add(dataResult);
				}

				if (!data.isEmpty()) {
					Map<String, Object> dataResult = new HashMap<String, Object>();
					dataResult.put("temDados", true);
					this.dados.add(dataResult);
					parametros.put("data", data);
				}
				this.resultSet = rset;
			}
		});
	}

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSql(Integer empresaId, String puntoVentasId, Boolean isRemarcacao) {
		StringBuilder sql = new StringBuilder();

		sql.append("SELECT ");
		sql.append("boleto.FECHORVENTA as dataRemarcacaoDevolucao, ");
		sql.append("boletoOriginal.FECHORVENTA as dataVenta, ");
		sql.append("origem.DESCPARADA as origem, ");
		sql.append("destino.DESCPARADA as destino, ");
		sql.append("agencia.NOMBPUNTOVENTA as agencia, ");
		sql.append("linha.DESCRUTA as linha, ");
		sql.append("servico.CORRIDA_ID as servico, ");
		sql.append("boleto.FECHORVIAJE as dataViagem, ");
		sql.append(isRemarcacao ? "boletoOriginal.FECHORVIAJE as dataViagemOriginal, " : " ");
		sql.append("CASE WHEN cliente.CLIENTE_ID  IS NULL THEN boleto.NOMBPASAJERO ELSE cliente.NOMBCLIENTE END as passageiro, ");
		sql.append("CASE WHEN cliente.CLIENTE_ID  IS NULL THEN boleto.DESCNUMDOC ELSE cliente.NUMIDENTIFICAUNO END as documento, ");
		sql.append("boleto.PRECIOPAGADO as preco, ");
		sql.append("COALESCE(eventoExtra.IMPINGRESO,0) as multa ");

		sql.append("FROM BOLETO boleto ");
		sql.append("INNER JOIN BOLETO  boletoOriginal ON boletoOriginal.BOLETO_ID = boleto.BOLETOORIGINAL_ID ");
		sql.append("INNER JOIN PARADA           origem ON origem.PARADA_ID        = boleto.ORIGEN_ID ");
		sql.append("INNER JOIN PARADA          destino ON destino.PARADA_ID       = boleto.DESTINO_ID ");
		sql.append("INNER JOIN RUTA              linha ON linha.RUTA_ID           = boleto.RUTA_ID ");
		sql.append("INNER JOIN CORRIDA         servico ON (servico.CORRIDA_ID     = boleto.CORRIDA_ID AND servico.FECCORRIDA = boleto.FECCORRIDA) ");
		sql.append("LEFT JOIN EVENTO_EXTRA eventoExtra ON eventoExtra.BOLETO_ID   = boletoOriginal.BOLETO_ID ");
		sql.append("INNER JOIN MARCA marca             ON marca.MARCA_ID 	        = boleto.MARCA_ID ");
		sql.append("LEFT JOIN CLIENTE cliente         ON cliente.CLIENTE_ID       = boleto.CLIENTE_ID ");
		sql.append("INNER JOIN PUNTO_VENTA       agencia ON agencia.PUNTOVENTA_ID = boleto.PUNTOVENTA_ID ");

		sql.append("WHERE ");
		sql.append(isRemarcacao ? "boleto.MOTIVOCANCELACION_ID = 23 " : "boleto.MOTIVOCANCELACION_ID = 32 ");
		sql.append("AND boleto.INDSTATUSBOLETO = 'C' ");
		sql.append("AND boleto.FECHORVENTA BETWEEN :data_inicial AND :data_final ");

		if (empresaId != null) {
			sql.append("AND marca.EMPRESA_ID = ").append(empresaId);
		}
		if (puntoVentasId != null && !puntoVentasId.isEmpty()) {
			sql.append("AND agencia.PUNTOVENTA_ID IN (").append(puntoVentasId).append(") ");
		}
		
		sql.append("ORDER BY boleto.FECHORVENTA ");
		return sql.toString();
	}
}
