package com.rjconsultores.ventaboletos.relatorios.impl;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioW2ISinteticoBean;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class RelatorioW2ISintetico extends Relatorio {

	private List<RelatorioW2ISinteticoBean> lsDadosRelatorio;

	public RelatorioW2ISintetico(Map<String, Object> parametros, Connection conexao) throws Exception {
		super(parametros, conexao);

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

				lsDadosRelatorio = new ArrayList<RelatorioW2ISinteticoBean>();

				String sql = getSql(parametros);

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
				ResultSet rset = null;
				
				java.sql.Date dataInicial = new java.sql.Date(DateUtil.normalizarToFecha((Date) parametros.get("DATA_INICIAL")).getTime());
				java.sql.Date dataFinal   = new java.sql.Date(DateUtil.normalizarToFecha((Date) parametros.get("DATA_FINAL")).getTime());
				
				stmt.setDate("DATA_INICIAL", dataInicial);
				stmt.setDate("DATA_FINAL", dataFinal);

				stmt.setDate("DATA_INICIAL_CANCEL",dataInicial);
				stmt.setDate("DATA_FINAL_CANCEL", dataFinal);

				if (parametros.get("EMPRESA_ID") != null)
					stmt.setInt("EMPRESA_ID", (Integer) parametros.get("EMPRESA_ID"));
				else
					stmt.setNull("EMPRESA_ID", java.sql.Types.INTEGER);

				if (parametros.get("ORIGEN_ID") != null && parametros.get("ORIGEN_ID") != "" && ((Integer) parametros.get("ORIGEN_ID") != -1))
					stmt.setInt("ORIGEN_ID", (Integer) parametros.get("ORIGEN_ID"));
				else
					stmt.setNull("ORIGEN_ID", java.sql.Types.INTEGER);

				if (parametros.get("DESTINO_ID") != null && parametros.get("DESTINO_ID") != "" && ((Integer) parametros.get("DESTINO_ID") != -1))
					stmt.setInt("DESTINO_ID", (Integer) parametros.get("DESTINO_ID"));
				else
					stmt.setNull("DESTINO_ID", java.sql.Types.INTEGER);

				rset = stmt.executeQuery();

				RelatorioW2ISinteticoBean relatorioW2ISinteticoBean = null;
				while (rset.next()) {
					relatorioW2ISinteticoBean = new RelatorioW2ISinteticoBean();
					relatorioW2ISinteticoBean.setEmpresaId(rset.getInt("empresaId"));
					relatorioW2ISinteticoBean.setEmpresa(rset.getString("empresa"));
					relatorioW2ISinteticoBean.setPuntoVentaId(rset.getInt("puntoVentaId"));
					relatorioW2ISinteticoBean.setAgencia(rset.getString("agencia"));
					relatorioW2ISinteticoBean.setQtdSeguroOpcionalCancelado(rset.getBigDecimal("qtdSeguroOpcionalCancelado") == null ? BigDecimal.ZERO : rset.getBigDecimal("qtdSeguroOpcionalCancelado"));
					relatorioW2ISinteticoBean.setTotalValorSeguroOpcionalCancelado(rset.getBigDecimal("totalValorSeguroOpcionalCancelado") == null ? BigDecimal.ZERO : rset.getBigDecimal("totalValorSeguroOpcionalCancelado"));
					relatorioW2ISinteticoBean.setQtdSeguroOpcionalVendidos(rset.getBigDecimal("qtdSeguroOpcionalVendidos") == null ? BigDecimal.ZERO : rset.getBigDecimal("qtdSeguroOpcionalVendidos"));
					relatorioW2ISinteticoBean.setTotalValorseguroOpcionalVendido(rset.getBigDecimal("totalValorSeguroOpcionalVendido") == null ? BigDecimal.ZERO : rset.getBigDecimal("totalValorSeguroOpcionalVendido"));
					lsDadosRelatorio.add(relatorioW2ISinteticoBean);

				}

				if (lsDadosRelatorio.size() > 0) {

					setLsDadosRelatorio(lsDadosRelatorio);
				}
			}

		});
	}

	public void setLsDadosRelatorio(List<RelatorioW2ISinteticoBean> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
	}

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSql(Map<String, Object> parametros) {
		String puntosVentaIds = (String) parametros.get("NUMPUNTOVENTA");
		puntosVentaIds = StringUtils.replace(puntosVentaIds, ",", "','");
		StringBuilder sql = new StringBuilder();

		sql.append(" SELECT DISTINCT ");
		sql.append(" tx.empresaId, ");
		sql.append(" tx.empresa, ");
		sql.append(" tx.puntoventaid, ");
		sql.append(" tx.agencia, ");
		sql.append(" SUM( (case when tx.status ='C' then 1 else 0  end)) qtdSeguroOpcionalCancelado, ");
		sql.append(" SUM( (case when tx.status ='C' then tx.valorTaxa else 0.0 end )) totalValorSeguroOpcionalCancelado, ");
		sql.append(" SUM( (case when tx.status ='V' then 1 else 0.0 end )) qtdSeguroOpcionalVendidos, ");
		sql.append(" SUM( (case when tx.status ='V' then tx.valorTaxa else 0.0 end )) totalValorSeguroOpcionalVendido ");
		sql.append(" FROM ( ");

		sql.append("   SELECT DISTINCT ");
		sql.append("   em.empresa_id AS empresaId, ");
		sql.append("   em.nombempresa AS empresa, ");
		sql.append("   pv.puntoventa_id AS puntoVentaId, ");
		sql.append("   pv.nombpuntoventa As agencia, ");
		sql.append("   b.numfoliosistema AS numBilhete, ");
		sql.append("   po.descparada AS origem, ");
		sql.append("   pd.descparada AS destino, ");
		sql.append("   b.fechorviaje dataViaje, ");
		sql.append("   b.fechorventa dataVenda, ");
		sql.append("   b.numasiento AS poltrona, ");
		sql.append("   sx.valor AS valorTaxa, ");
		sql.append("   'V' AS status ");
		sql.append("   FROM segpolv sx ");
		sql.append("   LEFT JOIN boleto b on b.boleto_id=sx.boleto_id ");
		sql.append("   INNER JOIN punto_venta pv ON pv.PUNTOVENTA_ID = b.PUNTOVENTA_ID ");
		sql.append("   INNER JOIN empresa em ON em.empresa_id=sx.empresa ");
		sql.append("   INNER JOIN parada po ON po.parada_id=sx.origen_id ");
		sql.append("   INNER JOIN parada pd ON pd.parada_id=sx.destino_id ");
		sql.append("   INNER JOIN CIUDAD co ON co.ciudad_id=po.ciudad_id ");
		sql.append("   INNER JOIN CIUDAD cd ON cd.ciudad_id=pd.ciudad_id ");
		sql.append("   WHERE TO_DATE(sx.DATAVENDA ,'yyMMdd') BETWEEN :DATA_INICIAL AND :DATA_FINAL ");
		sql.append("   AND em.empresa_id = COALESCE(:EMPRESA_ID, em.empresa_id) ");
		sql.append("   AND po.parada_id = COALESCE(:ORIGEN_ID, po.parada_id) ");
		sql.append("   AND pd.parada_id = COALESCE(:DESTINO_ID, pd.parada_id) ");

		if (!puntosVentaIds.contains("-1")) {
			sql.append("    AND pv.puntoventa_id IN ('" + puntosVentaIds + "') ");
		}

		sql.append("   UNION ");

		sql.append("   SELECT DISTINCT ");
		sql.append("   em.empresa_id AS empresaId, ");
		sql.append("   em.nombempresa AS empresa, ");
		sql.append("   pv.puntoventa_id AS puntoVentaId, ");
		sql.append("   pv.nombpuntoventa As agencia, ");
		sql.append("   b.numfoliosistema AS numBilhete, ");
		sql.append("   po.descparada AS origem, ");
		sql.append("   pd.descparada AS destino, ");
		sql.append("   b.fechorviaje dataViaje, ");
		sql.append("   b.fechorventa dataVenda, ");
		sql.append("   b.numasiento AS poltrona, ");
		sql.append("   (COALESCE(sx.valor, 0) * -1) AS valorTaxa, ");
		sql.append("   'C' AS status ");
		sql.append("   FROM segpolv sx ");
		sql.append("   LEFT JOIN boleto b on b.boleto_id=sx.boleto_id ");
		sql.append("   INNER JOIN punto_venta pv ON pv.PUNTOVENTA_ID = b.PUNTOVENTA_ID ");
		sql.append("   INNER JOIN empresa em ON em.empresa_id=sx.empresa ");
		sql.append("   INNER JOIN parada po ON po.parada_id=sx.origen_id ");
		sql.append("   INNER JOIN parada pd ON pd.parada_id=sx.destino_id ");
		sql.append("   INNER JOIN CIUDAD co ON co.ciudad_id=po.ciudad_id ");
		sql.append("   INNER JOIN CIUDAD cd ON cd.ciudad_id=pd.ciudad_id ");
		sql.append("   WHERE TO_DATE(sx.DATACANCELAMENTO ,'yyMMdd') BETWEEN :DATA_INICIAL_CANCEL AND :DATA_FINAL_CANCEL  ");
		sql.append("   AND em.empresa_id = COALESCE(:EMPRESA_ID, em.empresa_id) ");
		sql.append("   AND po.parada_id = COALESCE(:ORIGEN_ID, po.parada_id) ");
		sql.append("   AND pd.parada_id = COALESCE(:DESTINO_ID, pd.parada_id) ");

		if (!puntosVentaIds.contains("-1")) {
			sql.append("    AND pv.puntoventa_id IN ('" + puntosVentaIds + "') ");
		}

		sql.append("    ORDER BY dataVenda ASC ) tx ");
		sql.append(" GROUP BY tx.empresaId, tx.empresa, tx.puntoventaid, tx.agencia ");

		return sql.toString();
	}

}
