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 com.rjconsultores.ventaboletos.entidad.ContratoCorporativo;
import com.rjconsultores.ventaboletos.enums.DataGeracaoLegalizacaoEnum;
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.RelatorioDetalheContratoBean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

public class RelatorioDetalheContrato  extends Relatorio {

	private List<RelatorioDetalheContratoBean> lsDadosRelatorio;
	private BigDecimal valorAdicionado = BigDecimal.ZERO;
	private BigDecimal executado = BigDecimal.ZERO;

	public RelatorioDetalheContrato(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");
				DataGeracaoLegalizacaoEnum geracao = (DataGeracaoLegalizacaoEnum) parametros.get("GERACAO");
				EstadoBilheteConsultarEnum estadoBilhetes = (EstadoBilheteConsultarEnum) parametros.get("ESTADO_BILHETES");
				String numContrato = parametros.get("NUM_CONTRATO") != null ? parametros.get("NUM_CONTRATO").toString() : null;
				Boolean saldoContrato = (Boolean) parametros.get("SALDO_CONTRATO");

				NamedParameterStatement nps = new NamedParameterStatement(conexao, getSql(dataInicial, dataFinal, geracao, estadoBilhetes, numContrato));
				
				if(dataInicial != null && dataFinal != null){
					nps.setDate("dataInicial", new java.sql.Date(dataInicial.getTime()));
					nps.setDate("dataFinal", new java.sql.Date(dataFinal.getTime()));
				}
				
				if (numContrato != null) {
					nps.setString("numContrato", numContrato);
				}
				
				ResultSet rset = nps.executeQuery();

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

				while (rset.next()) {

					RelatorioDetalheContratoBean detalhe = new RelatorioDetalheContratoBean();
					detalhe.setTiquete(rset.getString("contratoId"));
					detalhe.setDataVenda((Date)rset.getObject("dataVenda"));
					detalhe.setDestino(rset.getString("destino"));
					detalhe.setOrigem(rset.getString("origem"));
					detalhe.setEmpresa(rset.getString("empresa"));
					detalhe.setEstado(rset.getString("estado"));
					detalhe.setFatura(rset.getString("fatura"));
					detalhe.setNomePassageiro(rset.getString("cliente"));
					detalhe.setNomeUsuario(rset.getString("usuario"));
					detalhe.setPassageiroCod((Long)rset.getObject("clicod"));
					detalhe.setPassagem(rset.getString("passagem"));
					detalhe.setPrecioPagado((BigDecimal)rset.getBigDecimal("valorUnit"));
					detalhe.setPreco((BigDecimal)rset.getBigDecimal("valorTiquete"));
					detalhe.setTipoDoc(rset.getString("tipoDoc"));
					detalhe.setClienteId(rset.getLong("clientecorporativo_id"));
					detalhe.setNomCliente(rset.getString("nomclientecorp"));
					
					if (detalhe.getTipoDoc() != null && detalhe.getTipoDoc().equals("Evento Extra")) {
						valorAdicionado.add(detalhe.getPrecioPagado());
					}
					
					executado.add(detalhe.getPrecioPagado());
					
					ls.add(detalhe);
				}

				setLsDadosRelatorio(ls);

				nps = new NamedParameterStatement(conexao, "select numContrato, valor_contrato from contrato_corporativo where numContrato = :numContrato");
				nps.setString("numContrato", parametros.get("NUMCONTRATO").toString());
				rset = nps.executeQuery();
				
				if (rset.next()) {
					BigDecimal valorContrato = rset.getBigDecimal("valor_contrato");
					parametros.put("CONTRATO", rset.getString("numContrato"));
					parametros.put("VALOR_CONTRATO", valorContrato);
					parametros.put("VALOR_ADICIONADO", valorAdicionado);
					parametros.put("EXECUTADO", executado);
					parametros.put("QUOTA_ATUAL", valorContrato.add(valorAdicionado).subtract(executado).abs());
				}
			}			
		});
	}

	private String getSql(Date dataInicial, Date dataFinal, DataGeracaoLegalizacaoEnum geracao,
			EstadoBilheteConsultarEnum status, String numContrato) {
		StringBuilder sb = new StringBuilder();
		sb.append("select ");
		sb.append("    COALESCE(c.numfoliosistema, TO_CHAR(v.voucher_id), TO_CHAR(e.eventoextra_id)) as contratoId, ");
		sb.append("    COALESCE(c.fechorventa, v.data_inclusao, e.fechoringreso) as dataVenda, ");
		sb.append("    case ");
		sb.append("        when c.caja_id is not null then 'Bilhete' ");
		sb.append("        when v.voucher_id is not null then 'Bono' ");
		sb.append("        when e.eventoextra_id is not null then 'Evento Extra' ");
		sb.append("    end as tipoDoc, ");
		sb.append("    v.num_fatura as fatura, ");
		sb.append("    v.status as estado, ");
		sb.append("    porigen.descparada as origem, ");
		sb.append("    pdestino.descparada as destino, ");
		sb.append("    1 as passagem, ");
		sb.append("    coalesce(c.preciopagado, 0) as valorUnit, ");
		sb.append("    coalesce(c.preciobase, 0) as valorTiquete, ");
		sb.append("    t.nome_transportadora as empresa, ");
		sb.append("    c.cliente_id as clicod, ");
		sb.append("    cli.nombcliente cliente, ");
		sb.append("    u.nombusuario as usuario, ");
		sb.append("    clicorp.clientecorporativo_id, ");
		sb.append("    clicorp.nomclientecorp ");
		sb.append("from caixa_contrato cc ");
		sb.append("join contrato_corporativo corp on corp.contrato_id = cc.contrato_id ");
		sb.append("join cliente_corporativo clicorp on clicorp.clientecorporativo_id = corp.clientecorporativo_id  ");
		sb.append("left join caja c on cc.caja_id = c.caja_id ");
		sb.append("left join voucher v on v.voucher_id = cc.voucher_id ");
		sb.append("left join transportadora t on t.transportadora_id = v.transportadora_id ");
		sb.append("left join evento_extra e on e.eventoextra_id = cc.eventoextra_id ");
		sb.append("left join cliente cli on cli.cliente_id = c.cliente_id ");
		sb.append("left join parada porigen on c.origen_id = porigen.parada_id ");
		sb.append("left join parada pdestino on c.destino_id = pdestino.parada_id ");
		sb.append("left join usuario u on u.usuario_id = c.usuario_id ");
		sb.append("where 1 = 1 ");
		
		if(dataInicial != null && dataFinal != null){
			sb.append("   and c.fechorventa between :dataInicial and :dataFinal   ");
			if (geracao == DataGeracaoLegalizacaoEnum.GERACAO) {
				sb.append("    and v.data_inclusao between :dataInicial and :dataFinal ");
			} else {
				sb.append("    and v.data_legaliza between :dataInicial and :dataFinal ");
			}
		}
		
		if (status != null) {
			if (status == EstadoBilheteConsultarEnum.FATURADO) {
				sb.append("   and v.status = 2 ");
			} else if (status == EstadoBilheteConsultarEnum.NAO_FATURADO) {
				sb.append("   and v.status <> 2 ");
			} 
		}
		if (numContrato != null) {
			sb.append("   and c.numfoliosistema = :numContrato or v.voucher_id = :numContrato or e.eventoextra_id = :numContrato  ");
		}
		
		return sb.toString();
	}

	@Override
	protected void processaParametros() throws Exception {
	}

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

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