package com.rjconsultores.ventaboletos.relatorios.impl;

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 com.rjconsultores.ventaboletos.enums.EstadoBilheteConsultarEnum;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioSaldosContratosBean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

public class RelatorioSaldosDeContratos   extends Relatorio {

	private List<RelatorioSaldosContratosBean> lsDadosRelatorio;

	public RelatorioSaldosDeContratos(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();
				
				Date dataInicial = (Date) parametros.get("DATA_DE");
				Date dataFinal = (Date) parametros.get("DATA_ATE");
				Integer empresaId = (Integer) parametros.get("EMPRESA_ID");
				String numContrato = parametros.get("NUM_CONTRATO") != null ? parametros.get("NUM_CONTRATO").toString() : null;
				Long grupoContratoId = (Long) parametros.get("GRUPOCONTRATO_ID");
				Integer status = (Integer) parametros.get("STATUS");

				NamedParameterStatement nps = new NamedParameterStatement(conexao, getSql(dataInicial, 
						dataFinal, empresaId, numContrato, grupoContratoId, status));
				
				if(dataInicial != null && dataFinal != null){
					nps.setDate("dataInicial", new java.sql.Date(dataInicial.getTime()));
					nps.setDate("dataFinal", new java.sql.Date(dataFinal.getTime()));
				}
				
				if (empresaId != null) {
					nps.setLong("clienteId", empresaId);
				}
				
				if (numContrato != null) {
					nps.setString("numContrato", numContrato);
				}
				
				if (grupoContratoId != null) {
					nps.setLong("grupoContratoId", grupoContratoId);
				}
				
				if (status != null) {
					nps.setInt("status", status);
				}
				
				ResultSet rset = nps.executeQuery();

				List<RelatorioSaldosContratosBean> ls = new ArrayList<RelatorioSaldosContratosBean>();

				while (rset.next()) {

					RelatorioSaldosContratosBean saldo = new RelatorioSaldosContratosBean();
					saldo.setAdicional(rset.getBigDecimal("adicao"));
					saldo.setDataInicio(rset.getDate("data_inicial"));
					saldo.setExecutado(rset.getBigDecimal("executado"));
					saldo.setNit(rset.getString("identificacao"));
					saldo.setNumContrato(rset.getString("numContrato"));
					saldo.setRazaoSocial(rset.getString("nomclientecorp"));
					saldo.setValorContrato(rset.getBigDecimal("valor_contrato"));
					saldo.setSaldoAtual(saldo.getValorContrato().add(saldo.getAdicional()).subtract(saldo.getExecutado()).abs());
					
					
					ls.add(saldo);
				}

				setLsDadosRelatorio(ls);
			}			
		});
	}

	private String getSql(Date dataInicial, Date dataFinal, Integer empresaId, 
			String numContrato, Long grupoContratoId, Integer status) {
		StringBuilder sb = new StringBuilder();
		sb.append("select ");
		sb.append("   cli.identificacao, ");
		sb.append("   cli.nomclientecorp, ");
		sb.append("   c.numcontrato, ");
		sb.append("   c.data_inicial, ");
		sb.append("   coalesce(c.valor_contrato,0) as valor_contrato, ");
		sb.append("   coalesce(a.adicao, 0) as adicao, ");
		sb.append("    sum(cc.valor) as executado ");
		sb.append("from contrato_corporativo c ");
		sb.append("left join (select coalesce(SUM(cc2.valor), 0) as adicao, cc2.contrato_id as contrato_id ");
		sb.append("        from caixa_contrato cc2 ");
		sb.append("        where cc2.eventoextra_id is not null ");
		sb.append("        group by cc2.contrato_id) a on a.contrato_id = c.contrato_id ");
		sb.append("join caixa_contrato cc on cc.contrato_id = c.contrato_id ");
		sb.append("join cliente_corporativo cli on cli.clientecorporativo_id = cli.clientecorporativo_id ");
		sb.append("where 1 = 1 ");
		
		if(dataInicial != null && dataFinal != null){
			sb.append("   and cc.data_lancamento between :dataInicial and :dataFinal   ");
		}
		
		if (empresaId != null) {
			sb.append("   and c.clientecorporativo_id = :clienteId   ");
		}
		
		if (numContrato != null) {
			sb.append("   and c.numcontrato in (:numContrato)  ");
		}
		
		if (grupoContratoId != null) {
			sb.append("   and c.grupocontrato_id = :grupoContratoId  ");
		}
		
		if (status != null) {
			sb.append("   and c.status_contrato = :status ");
		}
		
		sb.append("group by ");
		sb.append("    cli.identificacao, ");
		sb.append("   cli.nomclientecorp, ");
		sb.append("   c.numcontrato, ");
		sb.append("   c.data_inicial, ");
		sb.append("   c.valor_contrato,  a.adicao");
		return sb.toString();
	}

	@Override
	protected void processaParametros() throws Exception {
	}

	public List<RelatorioSaldosContratosBean> getLsDadosRelatorio() {
		return lsDadosRelatorio;
	}

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