package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
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 com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioOCDBean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

public class RelatorioOCDNaoResgatadaEmpresa extends Relatorio {

	private List<RelatorioOCDBean> lsDadosRelatorio;

	public RelatorioOCDNaoResgatadaEmpresa(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();

				String fecInicio = parametros.get("fecInicio").toString() + " 00:00:00";
				String fecFinal = parametros.get("fecFinal").toString() + " 23:59:59";
				Integer empresaId = parametros.get("empresa") != null ? Integer.parseInt(parametros.get("empresa").toString()) : null;
				boolean statusPendente = (Boolean) parametros.get("statusPendente");
				boolean statusPago = (Boolean) parametros.get("statusPago");

				String sql = getSql(fecInicio, fecFinal, empresaId, statusPendente, statusPago);

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
				ResultSet rset = null;

				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
				stmt.setTimestamp("fecInicio", new java.sql.Timestamp(sdf.parse(fecInicio).getTime()));
				stmt.setTimestamp("fecFinal", new java.sql.Timestamp(sdf.parse(fecFinal).getTime()));
				if (empresaId != null) {
					stmt.setInt("empresaId", empresaId);
				}

				rset = stmt.executeQuery();

				lsDadosRelatorio = new ArrayList<RelatorioOCDBean>();

				while (rset.next()) {
					RelatorioOCDBean ocdBean = new RelatorioOCDBean();
					ocdBean.setBoletoId(rset.getLong("boleto_Id"));
					ocdBean.setFecinc(rset.getDate("fecinc"));
					ocdBean.setFecpagar(rset.getDate("fecpagar"));
					ocdBean.setFecpago(rset.getDate("fecpago"));
					ocdBean.setIndpago(rset.getBoolean("indpago"));
					ocdBean.setEmpresa(rset.getString("nombempresa"));
					ocdBean.setNombpuntoventa(rset.getString("nombpuntoventa") != null ? rset.getString("nombpuntoventa") : "");
					ocdBean.setNombpuntoventapago(rset.getString("nombpuntoventapago") != null ? rset.getString("nombpuntoventapago") : "");
					ocdBean.setNombusuario(rset.getString("nombusuario") != null ? rset.getString("nombusuario") : "");
					ocdBean.setNombusuarioinc(rset.getString("nombusuarioinc") != null ? rset.getString("nombusuarioinc") : "");
					ocdBean.setNombusuariopago(rset.getString("nombusuariopago") != null ? rset.getString("nombusuariopago") : "");
					ocdBean.setNumoperacion(rset.getString("numoperacion"));
					ocdBean.setPenalizacion(rset.getBigDecimal("penalizacion"));
					ocdBean.setValorPagar(rset.getBigDecimal("valor_Pagar"));

					lsDadosRelatorio.add(ocdBean);
				}

				if (lsDadosRelatorio.size() > 0) {

					setLsDadosRelatorio(lsDadosRelatorio);
				}
			}
		});
	}

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

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSql(String fecInicio, String fecFinal, Integer empresaId,
			boolean statusPendente, boolean statusPago) {
		StringBuffer sql = new StringBuffer();

		sql.append("select nombempresa, o.*, ui.nombusuario nombusuarioinc, ");
		sql.append("up.nombusuario nombusuariopago, u.nombusuario nombusuario,   ");
		sql.append("p.nombpuntoventa nombpuntoventa, pp.nombpuntoventa nombpuntoventapago ");
		sql.append("from ocd o ");
		sql.append("join boleto b on b.boleto_id = o.boleto_id  ");
		sql.append("join marca m on m.marca_id = b.marca_id ");
		sql.append("join empresa e on m.empresa_id = e.empresa_id ");
		sql.append("join usuario u on u.usuario_id = o.usuario_id ");
		sql.append("join usuario ui on ui.usuario_id = o.usuarioinc_id  ");
		sql.append("left join usuario up on up.usuario_id = o.usuariopago_id ");
		sql.append("join punto_venta p on p.puntoventa_id = o.puntoventa_id  ");
		sql.append("left join punto_venta pp on pp.puntoventa_id = o.puntoventapago_id ");
		sql.append("where o.fecpagar between :fecInicio and  :fecFinal ");
		sql.append(" and o.activo = 1 ");
		sql.append(statusPendente ? " and o.fecpago is null " : "");
		sql.append(statusPendente ? " and o.indpago = 0 " : "");
		sql.append(statusPago ? " and o.fecpago is not null " : "");
		sql.append(statusPago ? " and o.indpago = 1 " : "");

		if (empresaId != null) {
			sql.append("and e.empresa_id = :empresaId ");
		}

		return sql.toString();
	}
}
