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.List;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

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

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

public class RelatorioBoletos extends Relatorio {

	private static Logger log = LogManager.getLogger(RelatorioBoletos.class);

	private List<RelatorioBoletoBean> lsDadosRelatorio;

	public RelatorioBoletos(Map<String, Object> parametros, Connection conexao, final String... nomeSubReporte) {
		super(parametros, conexao);

		try {
			this.setCustomDataSource(new DataSource(this) {
				@Override
				public void initDados() throws Exception {

					Connection conexao = this.relatorio.getConexao();

					Map<String, Object> parametros = this.relatorio.getParametros();

					Integer puntoventaId = parametros.get(PUNTOVENTA_ID) != null ? Integer.parseInt(parametros.get(PUNTOVENTA_ID).toString()) : null;
					Integer empresaId = parametros.get(EMPRESA_ID) != null ? Integer.parseInt(parametros.get(EMPRESA_ID).toString()) : null;
					Boolean filtrarPendentes = parametros.get("filtrarPendentes") != null ? Boolean.parseBoolean(parametros.get("filtrarPendentes").toString()) : false;
					String fecInicio = parametros.get(FEC_INICIO) != null ? parametros.get(FEC_INICIO).toString() + " 00:00:00" :null;
					String fecFinal = parametros.get(FEC_FINAL) != null ? parametros.get(FEC_FINAL).toString() + " 23:59:59" :null;
					String baixaInicial = parametros.get(BAIXA_INICIAL) != null ? parametros.get(BAIXA_INICIAL).toString() + " 00:00:00" :null;
					String baixaFinal = parametros.get(BAIXA_FINAL) != null ? parametros.get(BAIXA_FINAL).toString() + " 23:59:59" :null;

					String sql = getSQL(puntoventaId, empresaId, filtrarPendentes, fecInicio, fecFinal, baixaInicial, baixaFinal);

					NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
					if(fecInicio != null && fecFinal != null) {
						stmt.setTimestamp(FEC_INICIO, DateUtil.getTimestampFromString(fecInicio, DateUtil.ddMMaaHH24mmss));
						stmt.setTimestamp(FEC_FINAL, DateUtil.getTimestampFromString(fecFinal, DateUtil.ddMMaaHH24mmss));
					}
					
					if(baixaInicial != null && baixaFinal != null) {
						stmt.setTimestamp(BAIXA_INICIAL, DateUtil.getTimestampFromString(baixaInicial, DateUtil.ddMMaaHH24mmss));
						stmt.setTimestamp(BAIXA_FINAL, DateUtil.getTimestampFromString(baixaFinal, DateUtil.ddMMaaHH24mmss));
					}
					
					if(puntoventaId != null && puntoventaId != -1) {
						stmt.setInt(PUNTOVENTA_ID, puntoventaId);
					}
					
					if(empresaId != null) {
						stmt.setInt(EMPRESA_ID, empresaId);
					}
					
					ResultSet rs = stmt.executeQuery();
					rs.setFetchSize(500);

					lsDadosRelatorio = new ArrayList<RelatorioBoletoBean>();

					while (rs.next()) {
						RelatorioBoletoBean boleto = new RelatorioBoletoBean();
						boleto.setNombempresa(rs.getString("nombempresa"));
						boleto.setNombpuntoventa(rs.getString("nombpuntoventa"));
						boleto.setNumpuntoventa(rs.getString("numpuntoventa"));
						boleto.setDtfechamento(rs.getDate("dtfechamento"));						
						boleto.setDtvencimento(rs.getDate("dtvencimento"));
						boleto.setDtbaixa(rs.getDate("dtbaixa"));						
						boleto.setVrfechamento(rs.getBigDecimal("vrfechamento"));						
						boleto.setVrboleto(rs.getBigDecimal("vrboleto"));
						boleto.setVrjuros(rs.getBigDecimal("vrjuros"));
						boleto.setNossonumero(rs.getString("nossonumero"));
						boleto.setQuitado(rs.getBoolean("quitado"));
						
						if(boleto.isQuitado()) {
							boleto.setVrpendente(BigDecimal.ZERO);
						}else {
							boleto.setVrpendente(boleto.getVrboleto());
						}						
						
						lsDadosRelatorio.add(boleto);
					}

					if (!lsDadosRelatorio.isEmpty()) {
						setLsDadosRelatorio(lsDadosRelatorio);
					}
					
					setNomeSubReporte(nomeSubReporte);
				}

			});
		} catch (Exception e) {
			log.error("", e);
		}
	}

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

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSQL(Integer puntoventaId, Integer empresaId, boolean filtrarPendentes, 
			String fecInicio, String fecFinal, String baixaInicial, String baixaFinal) {

		StringBuilder sql = new StringBuilder();
		
		sql.append(" SELECT ");
		sql.append("       e.nombempresa, ");
		sql.append("       p.nombpuntoventa, ");
		sql.append("       p.numpuntoventa, ");
		sql.append("       fcc.fecfechamento          AS dtfechamento, ");
		sql.append("       fb.fecvencimento           AS dtvencimento, ");
		sql.append("       fb.valordocumento          AS vrboleto, ");
		sql.append("       fcc.total                  AS vrfechamento, ");
		sql.append("       fb.fecbaixa                AS dtbaixa, ");
		sql.append("       fb.valor_juros             AS vrjuros, ");
		sql.append("       NVL(fb.indboletoquitado,0) AS quitado, ");
		sql.append("       fb.nossonumero             AS nossonumero ");
		sql.append("  FROM fechamento_boleto fb ");
		sql.append(" INNER JOIN fechamento_cntcorrente fcc ");
		sql.append("    ON fcc.fechamentocntcorrente_id = fb.fechamentocntcorrente_id ");
		sql.append("   AND fcc.activo = 1 ");
		sql.append(" INNER JOIN punto_venta p  ");
		sql.append("    ON p.puntoventa_id = fcc.puntoventa_id ");
		sql.append("   AND p.activo = 1 ");
		sql.append(" INNER JOIN empresa e ");
		sql.append("    ON e.empresa_id = fcc.empresa_id ");
		sql.append("   AND e.activo = 1 ");
		sql.append(" WHERE fb.activo = 1 ");
		sql.append("   AND fb.tipo_pagamento = 'B' ");
		
		if(fecInicio != null && fecFinal != null) {
			sql.append("   AND fcc.fecfechamento BETWEEN :fecInicio AND :fecFinal ");
		}
		
		if(baixaInicial != null && baixaFinal != null) {
			sql.append("   AND fb.fecbaixa BETWEEN :baixaInicial AND :baixaFinal ");
		}
		
		if(puntoventaId != null && puntoventaId != -1) {
			sql.append("   AND fcc.puntoventa_id = :puntoventaId ");
		}
		
		if(empresaId != null) {
			sql.append("   AND e.empresa_id = :empresaId ");
		}
		
		if(filtrarPendentes) {
			sql.append("   AND (fb.indboletoquitado is null or fb.indboletoquitado = 0) ");
		}
		
		sql.append(" ORDER BY nombempresa, p.numpuntoventa, fcc.fecfechamento ");
		return sql.toString();
	}
} 
