package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.util.Date;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
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.web.utilerias.NamedParameterStatement;

public class RelatorioHistoricoClientes extends Relatorio {
	
	private boolean agrupar; 

	public RelatorioHistoricoClientes(Map<String, Object> parametros, Connection conexao) 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(parametros);

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
				agrupar = parametros.get("AGRUPAR").toString().equals("true");
				ResultSet rset = stmt.executeQuery();

				while (rset.next()) {
					Map<String, Object> dataResult = new HashMap<String, Object>();

					dataResult.put("nomeCliente", rset.getString("nomeCliente"));
					dataResult.put("cpfCliente", rset.getString("cpfCliente"));
					dataResult.put("emailCliente", rset.getString("emailCliente"));
					dataResult.put("telCliente", rset.getString("telCliente"));
					dataResult.put("celular", rset.getString("celular"));
					dataResult.put("sigla", rset.getString("sigla"));
					dataResult.put("bilhete", rset.getString("bilhete"));
					dataResult.put("codAgencia", rset.getString("codAgencia"));
					dataResult.put("agencia", rset.getString("agencia"));
					dataResult.put("linha", rset.getString("linha"));
					dataResult.put("origem", rset.getString("origem"));
					dataResult.put("destino", rset.getString("destino"));
					dataResult.put("servico", rset.getString("servico"));
					dataResult.put("classe", rset.getString("classe"));
					dataResult.put("poltrona", rset.getString("poltrona"));
					dataResult.put("dataVenda", rset.getDate("dataVenda"));
					dataResult.put("dataViagem", rset.getDate("dataViagem"));
					dataResult.put("tarifa", rset.getBigDecimal("tarifa"));
					dataResult.put("taxas", rset.getBigDecimal("taxas"));
					dataResult.put("formapago", rset.getString("formapago"));
					dataResult.put("parcelas", rset.getString("parcelas"));

					this.dados.add(dataResult);
				}

				this.resultSet = rset;
			}
		});
	}
	
	@Override
	public String getNome() {
		if (agrupar) {
			return super.getNome();
		} else {
			return super.getNome() + "SemAgrupamento";
		}
	}
	
	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSql(Map<String, Object> parametros) {

		StringBuilder sql = new StringBuilder();

		String formatToDate = ("'dd/MM/yyyy hh24:mi:ss'");
		SimpleDateFormat formatSemHora = new SimpleDateFormat("dd/MM/yyyy");

		Date dataVendaIncial = (Date) parametros.get("DATA_VENDA_INICIAL");
		Date dataVendaFinal = (Date) parametros.get("DATA_VENDA_FINAL");
		Date dataEmbarqueIncial = (Date) parametros.get("DATA_EMBARQUE_INICIAL");
		Date dataEmbarqueFinal = (Date) parametros.get("DATA_EMBARQUE_FINAL");
		Integer empresaId = (Integer) parametros.get("EMPRESA_ID");
		String puntoVentas = (String) parametros.get("NUMPUNTOVENTA");
		String rutas = (String) parametros.get("NUMRUTA");

		sql.append("SELECT CASE WHEN ((caja.TIPOVENTA_ID IN (12,18,49,5) AND caja.INDSTATUSBOLETO = 'E') "); 
		sql.append("OR (caja.TIPOVENTA_ID NOT IN (12,18,49,5))) ");
		sql.append("THEN 'NO'     ELSE 'IP' END as sigla,");
		sql.append("caja.NUMFOLIOSISTEMA 		  AS bilhete, ");
		sql.append("puntoVenta.NUMPUNTOVENTA      AS codAgencia, ");
		sql.append("puntoVenta.NOMBPUNTOVENTA     AS agencia, ");
		sql.append("ruta.DESCRUTA 				  AS linha, ");
		sql.append("origem.DESCPARADA 			  AS origem, ");
		sql.append("destino.DESCPARADA 			  AS destino, ");
		sql.append("caja.CORRIDA_ID 			  AS servico, ");
		sql.append("classe.DESCCLASE 			  AS classe, ");
		sql.append("caja.NUMASIENTO 			  AS poltrona, ");
		sql.append("caja.FECHORVENTA 			  AS dataVenda, ");
		sql.append("caja.FECHORVIAJE 			  AS dataViagem, ");
		sql.append("caja.PRECIOPAGADO 			  AS tarifa, ");
		sql.append("cliente.NOMBCLIENTE 		  AS nomeCliente, ");
		sql.append("cliente.NUMIDENTIFICAUNO 	  AS cpfCliente, ");
		sql.append("cliente.DESCCORREO 			  AS emailCliente, ");
		sql.append("cliente.NUMTELEFONO 	      AS telCliente, ");
		sql.append("cliente.NUMTELEFONODOS        AS celular, ");
		sql.append("caja.IMPORTEOUTROS + caja.IMPORTEPEDAGIO + caja.IMPORTESEGURO + caja.IMPORTETAXAEMBARQUE 			AS taxas, ");
		sql.append("(SELECT LISTAGG(formaPago.CVEPAGO, ',') WITHIN GROUP (ORDER BY formaPago.CVEPAGO) ");
		sql.append("FROM CAJA caja2 ");
		sql.append("INNER JOIN CAJA_FORMAPAGO cajaFormaPago ON cajaFormaPago.CAJA_ID = caja2.CAJA_ID ");
		sql.append("INNER JOIN FORMA_PAGO formaPago ON formaPago.FORMAPAGO_ID = cajaFormaPago.FORMAPAGO_ID ");
		sql.append("WHERE caja2.CAJA_ID = caja.CAJA_ID) AS formaPago, ");    
		sql.append("(SELECT LISTAGG(COALESCE(cajaTarjeta.CANTPARCELAS,1), ',') WITHIN GROUP (ORDER BY cajaTarjeta.CANTPARCELAS) ");
		sql.append("FROM CAJA caja3 ");
		sql.append("LEFT JOIN CAJA_DET_PAGO cajaDetPago ON cajaDetPago.CAJA_ID = caja3.CAJA_ID ");
		sql.append("LEFT JOIN CAJA_TARJETA cajaTarjeta ON cajaTarjeta.CAJADETPAGO_ID = cajaDetPago.CAJADETPAGO_ID ");
		sql.append("WHERE caja3.CAJA_ID = caja.CAJA_ID) as parcelas ");
		sql.append("FROM CAJA caja ");
		sql.append("INNER JOIN RUTA 				   ruta ON ruta.RUTA_ID 			  = caja.RUTA_ID ");
		sql.append("INNER JOIN PARADA 				 origem ON origem.PARADA_ID 	      = caja.ORIGEN_ID ");
		sql.append("INNER JOIN PARADA 				destino ON destino.PARADA_ID 	      = caja.DESTINO_ID ");
		sql.append("INNER JOIN CLASE_SERVICIO 		 classe ON classe.CLASESERVICIO_ID 	  = caja.CLASESERVICIO_ID ");
		sql.append("INNER JOIN CLIENTE 				cliente ON caja.CLIENTE_ID 			  = cliente.CLIENTE_ID ");
		sql.append("INNER JOIN PUNTO_VENTA       puntoVenta ON puntoVenta.PUNTOVENTA_ID   = caja.PUNTOVENTA_ID ");

		sql.append("WHERE caja.MOTIVOCANCELACION_ID IS NULL ");
		sql.append("AND (caja.INDSTATUSBOLETO in( 'V','T') and INDREIMPRESION = 0 and not exists(select *  from caja c1 where c1.indstatusboleto = 'E' and  caja.transacao_id = C1.TRANSACAOORIGINAL_ID ) or caja.INDSTATUSBOLETO = 'E' ) ");

		if (empresaId != null) {
			sql.append("AND caja.EMPRESACORRIDA_ID = " + empresaId + " ");
		}
		if (puntoVentas != null && !puntoVentas.isEmpty()) {
			sql.append("AND caja.PUNTOVENTA_ID IN (" + puntoVentas + ") ");
		}
		if (rutas != null && !rutas.isEmpty()) {
			sql.append("AND caja.RUTA_ID IN (" + rutas + ") ");
		}
		if (dataVendaIncial != null && dataVendaFinal != null) {
			sql.append("AND caja.FECHORVENTA BETWEEN TO_DATE('" + formatSemHora.format(dataVendaIncial) + " 00:00:00', " + formatToDate + ") "
					+ "AND TO_DATE('" + formatSemHora.format(dataVendaFinal) + " 23:59:59', " + formatToDate + ") ");
		}
		if (dataEmbarqueIncial != null && dataEmbarqueFinal != null) {
			sql.append("AND caja.FECHORVIAJE BETWEEN TO_DATE('" + formatSemHora.format(dataEmbarqueIncial) + " 00:00:00', " + formatToDate + ") "
					+ "AND TO_DATE('" + formatSemHora.format(dataEmbarqueFinal) + " 23:59:59', " + formatToDate + ") ");
		}
		
		sql.append("ORDER BY cliente.NOMBCLIENTE, ");
		sql.append("cliente.NUMIDENTIFICAUNO, ");
		sql.append("cliente.DESCCORREO, ");
		sql.append("cliente.NUMTELEFONO");
		
		return sql.toString();
	}

}
