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

public class RelatorioDiferencasTransferencias extends Relatorio {

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

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

				while (rset.next()) {

					Map<String, Object> dataResult = new HashMap<String, Object>();

					dataResult.put("classe_original", rset.getString("classe_original"));
					dataResult.put("total_pago_original", rset.getBigDecimal("total_pago_original"));
					dataResult.put("classe_novo", rset.getString("classe_novo"));
					dataResult.put("diferença_preço", rset.getBigDecimal("diferença_preço"));

					this.dados.add(dataResult);
				}

				this.resultSet = rset;
			}
		});
	}

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSql() {
		StringBuilder sql = new StringBuilder();

		sql.append(" SELECT CS_ORIG.DESCCLASE AS classe_original, ");
		sql.append(" 	( B_ORIG.PRECIOPAGADO + B_ORIG.IMPORTETAXAEMBARQUE + B_ORIG.IMPORTEPEDAGIO + B_ORIG.IMPORTEOUTROS + B_ORIG.IMPORTESEGURO ) AS total_pago_original, ");
		sql.append("	CS_NOVO.DESCCLASE AS classe_novo, ");
		sql.append("	 (CASE   WHEN  ee.tipoeventoextra_id =  62 THEN ( -1 * (ee.IMPINGRESO) ) ELSE (ee.IMPINGRESO) END) AS diferença_preço    ");
		sql.append(" FROM BOLETO B_NOVO  ");

		sql.append(" INNER JOIN CAJA_DIVERSOS CD ");
		sql.append(" ON CD.NUMOPERACION = B_NOVO.NUMOPERACION");
		sql.append(" INNER JOIN EVENTO_EXTRA EE ");
		sql.append(" ON EE.EVENTOEXTRA_ID = CD.EVENTOEXTRA_ID ");
		sql.append(" INNER JOIN TIPO_EVENTO_EXTRA TEE ");
		sql.append(" ON TEE.TIPOEVENTOEXTRA_ID  = EE.TIPOEVENTOEXTRA_ID ");
		sql.append(" AND EE.TIPOEVENTOEXTRA_ID IN (62 , 63) ");
		sql.append(" INNER JOIN BOLETO B_ORIG ");
		sql.append(" ON B_ORIG.BOLETO_ID = B_NOVO.BOLETOORIGINAL_ID ");
		sql.append(" INNER JOIN CLASE_SERVICIO CS_NOVO ");
		sql.append(" ON CS_NOVO.CLASESERVICIO_ID = B_NOVO.CLASESERVICIO_ID ");
		sql.append(" INNER JOIN CLASE_SERVICIO CS_ORIG ");
		sql.append(" ON CS_ORIG.CLASESERVICIO_ID = B_ORIG.CLASESERVICIO_ID ");

		sql.append("WHERE B_NOVO.INDSTATUSBOLETO LIKE 'T' ");
		sql.append(" AND B_NOVO.FECHORVENTA >= :DATA_INICIAL ");
		sql.append(" AND B_NOVO.FECHORVENTA <= :DATA_FINAL ");
		sql.append(" AND B_NOVO.BOLETOORIGINAL_ID IS NOT NULL ");
		sql.append(" ORDER BY ");
		sql.append(" 	CASE ");
		sql.append(" 		WHEN cs_orig.DESCCLASE = cs_novo.DESCCLASE THEN 1 ");
		sql.append(" 		WHEN cs_orig.DESCCLASE <> cs_novo.DESCCLASE THEN 2 ");
		sql.append(" 		ELSE 3 ");
		sql.append(" 	END asc, ");
		sql.append(" 	cs_orig.DESCCLASE ");

		return sql.toString();
	}

}
