package com.rjconsultores.ventaboletos.relatorios.impl;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

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

import org.apache.log4j.Logger;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioDepositoBean;

public class RelatorioDepositos extends Relatorio {
	
	private static Logger log = Logger.getLogger(RelatorioDepositos.class);

	private List<RelatorioDepositoBean> lsDadosRelatorio;

	public RelatorioDepositos(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("puntoventaId") != null ? Integer.parseInt(parametros.get("puntoventaId").toString()) : null;
					Integer empresaId = parametros.get("empresaId") != null ? Integer.parseInt(parametros.get("empresaId").toString()) : null;
					Boolean filtrarPendentes = parametros.get("filtrarPendentes") != null ? Boolean.parseBoolean(parametros.get("filtrarPendentes").toString()) : false;
					String fecInicio = parametros.get("fecInicio").toString() + " 00:00:00";
					String fecFinal = parametros.get("fecFinal").toString() + " 23:59:59";

					String sql = getSQL(puntoventaId, empresaId, filtrarPendentes);

					PreparedStatement stmt = conexao.prepareStatement(sql);
					
					ResultSet rs = null;
					SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");

					stmt.setTimestamp(1, new java.sql.Timestamp(sdf.parse(fecInicio).getTime()));
					stmt.setTimestamp(2, new java.sql.Timestamp(sdf.parse(fecFinal).getTime()));
					
					rs = stmt.executeQuery();

					lsDadosRelatorio = new ArrayList<RelatorioDepositoBean>();

					while (rs.next()) {

						RelatorioDepositoBean deposito = new RelatorioDepositoBean();
						deposito.setNombempresa(rs.getString(1));
						deposito.setNombpuntoventa(rs.getString(2));
						deposito.setDtmotivo(rs.getDate(3));
						deposito.setSaldo(rs.getBigDecimal(4).multiply(BigDecimal.valueOf(-1)));
						deposito.setVrdeposito(rs.getBigDecimal(5));
						deposito.setVrfechamento(rs.getBigDecimal(6));
						lsDadosRelatorio.add(deposito);
					}

					if (lsDadosRelatorio.size() > 0) {
						setLsDadosRelatorio(lsDadosRelatorio);
					}
					setNomeSubReporte(nomeSubReporte);
				}
			});
		} catch (Exception e) {
			log.error("", e);
		}
	}

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

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSQL(Integer puntoVentaId, Integer empresaId, boolean filtrarPendentes) {

		StringBuilder sql = new StringBuilder();
		
		sql.append(" SELECT tmp.* FROM (  ");
		sql.append(" SELECT e.nombempresa,  ");
		sql.append("   p.nombpuntoventa,  ");
		sql.append("   f.fecfechamento                         AS dtmotivo,  ");
		sql.append("   ( sum(NVL(fd.valor_pago,0)) - f.total ) AS saldo,  ");
		sql.append("   SUM(NVL(fd.valor_pago,0))               AS vrfechamento ,  ");
		sql.append("   f.total           	  		       AS vrdeposito  ");
		sql.append(" FROM fechamento_cntcorrente f  ");
		sql.append(" INNER JOIN punto_venta p  ");
		sql.append(" ON p.puntoventa_id = f.puntoventa_id  ");
		sql.append(" INNER JOIN empresa e  ");
		sql.append(" ON e.empresa_id = f.empresa_id  ");
		sql.append(" LEFT JOIN fechamento_cct_deposito fd  ");
		sql.append(" ON fd.fechamentocntcorrente_id = f.fechamentocntcorrente_id  ");
		sql.append(" AND fd.activo                  = 1  ");
		sql.append(" WHERE f.fecfechamento BETWEEN ? AND ?  ");
		sql.append(" AND f.activo                  = 1 ");
		
		if (puntoVentaId != null){
			sql.append(" and f.puntoventa_id = " + puntoVentaId);
		}
		if (empresaId != null){
			sql.append(" and e.empresa_id = " + empresaId);
		}
		
		sql.append(" GROUP BY e.nombempresa,  ");
		sql.append("   p.nombpuntoventa,  ");
		sql.append("   f.fecfechamento,  ");
		sql.append("   f.total ) tmp ");
		if (filtrarPendentes){
			sql.append(" where ");
			sql.append(" tmp.saldo < tmp.vrdeposito and tmp.saldo <> 0");
		}
		
		sql.append(" ORDER BY tmp.nombempresa,  ");
		sql.append("   tmp.nombpuntoventa,  ");
		sql.append("   tmp.dtmotivo, ");
		sql.append("   tmp.vrdeposito  ");
		
		return sql.toString();
	}
}
