package com.rjconsultores.ventaboletos.relatorios.impl;

import java.math.BigDecimal;
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 org.apache.commons.lang.math.NumberUtils;

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

public class RelatorioAgenciaFechamento extends Relatorio {

	private List<RelatorioAgenciaFechamentoBean> lsDadosRelatorio;

	public RelatorioAgenciaFechamento(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";
				String empresa = parametros.get("empresa") != null ? parametros.get("empresa").toString() : "";
				String empresaNome = parametros.get("empresaNome") != null ? parametros.get("empresaNome").toString() : "";
				String puntoVenta = parametros.get("NUMPUNTOVENTA") != null ? parametros.get("NUMPUNTOVENTA").toString() : null;

				lsDadosRelatorio = new ArrayList<RelatorioAgenciaFechamentoBean>();

				String sql = carregarDadosTotaisdeVenda(puntoVenta);

				System.out.println(sql);

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
				ResultSet rset1 = null;
				ResultSet rset2 = null;
				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");

				stmt.setTimestamp("de", new java.sql.Timestamp(sdf.parse(fecInicio).getTime()));
				stmt.setTimestamp("ate", new java.sql.Timestamp(sdf.parse(fecFinal).getTime()));

				if (empresa != null && !empresa.equals("")) {
					stmt.setInt("empresaId", Integer.parseInt(empresa));
				}

				if (puntoVenta != null && !puntoVenta.equals("-1")) {
					stmt.setString("puntoVentaId", puntoVenta);
				}

				rset1 = stmt.executeQuery();

				while (rset1.next()) {

					RelatorioAgenciaFechamentoBean agenciaFechamento = new RelatorioAgenciaFechamentoBean();
					BigDecimal total = BigDecimal.ZERO;
					BigDecimal vendido = BigDecimal.ZERO;
					
					String puntoVentaId = rset1.getString("codigo");

					Integer qtdevendido = rset1.getInt("qtdevendido");
					Integer qtdedigitado = rset1.getInt("qtdedigitado");
					Integer qtdeAnulado = rset1.getInt("qtdeAnulado");
					Integer qtdeDevolvido = rset1.getInt("qtdeDevolvido");
					Integer qtdeTotal = null;

					vendido = rset1.getBigDecimal("vendido");
					BigDecimal digitado = rset1.getBigDecimal("digitado");
					BigDecimal anulado = rset1.getBigDecimal("anulado");
					BigDecimal devolvido = rset1.getBigDecimal("devolvido");

					agenciaFechamento.setEmpresa(empresaNome);

					agenciaFechamento.setCodigo(rset1.getString("codigo"));
					agenciaFechamento.setDescricao(rset1.getString("descricao"));

					agenciaFechamento.setQtdeVendido(qtdevendido != null ? qtdevendido : NumberUtils.INTEGER_ZERO);
					agenciaFechamento.setQtdeDigitado(qtdedigitado != null ? qtdedigitado : NumberUtils.INTEGER_ZERO);
					agenciaFechamento.setQtdeAnulado(qtdeAnulado != null ? qtdeAnulado : NumberUtils.INTEGER_ZERO);
					agenciaFechamento.setQtdeDevolvido(qtdeDevolvido != null ? qtdeDevolvido : NumberUtils.INTEGER_ZERO);

					qtdeTotal = ((qtdevendido != null ? qtdevendido : NumberUtils.INTEGER_ZERO) + (qtdedigitado != null ? qtdedigitado : NumberUtils.INTEGER_ZERO))
							- ((qtdeAnulado != null ? qtdeAnulado : NumberUtils.INTEGER_ZERO) + (qtdeDevolvido != null ? qtdeDevolvido : NumberUtils.INTEGER_ZERO));

					if (qtdeTotal < 0) {
						qtdeTotal = NumberUtils.INTEGER_ZERO;
					}

					agenciaFechamento.setQtdeTotal(qtdeTotal);

					agenciaFechamento.setDigitado(digitado != null ? digitado : BigDecimal.ZERO);
					agenciaFechamento.setAnulado(anulado != null ? anulado : BigDecimal.ZERO);
					agenciaFechamento.setDevolvido(devolvido != null ? devolvido : BigDecimal.ZERO);

					total = total.add(vendido != null ? vendido : BigDecimal.ZERO);
					total = total.add(digitado != null ? digitado : BigDecimal.ZERO);
					total = total.subtract(anulado != null ? anulado : BigDecimal.ZERO);
					total = total.subtract(devolvido != null ? devolvido : BigDecimal.ZERO);
					
					stmt = new NamedParameterStatement(conexao, carregarDadosReceitaDespesa(puntoVentaId));
					
					System.out.println(carregarDadosReceitaDespesa(puntoVentaId));

					stmt.setTimestamp("de", new java.sql.Timestamp(sdf.parse(fecInicio).getTime()));
					stmt.setTimestamp("ate", new java.sql.Timestamp(sdf.parse(fecFinal).getTime()));

					if (empresa != null && !empresa.equals("")) {
						stmt.setInt("empresaId", Integer.parseInt(empresa));
					}
					
					if (puntoVentaId != null ) {
						stmt.setString("puntoVentaId", puntoVentaId);
					}

					rset2 = stmt.executeQuery();

					if (rset2.next()) {

						Integer qtdedespesa = rset2.getInt("qtdedespesa");
						BigDecimal receita = rset2.getBigDecimal("receita");
						BigDecimal despesa = rset2.getBigDecimal("despesa");

						agenciaFechamento.setQtdeDespesa(qtdedespesa != null ? qtdedespesa : NumberUtils.INTEGER_ZERO);
						agenciaFechamento.setReceita(receita != null ? receita : BigDecimal.ZERO);
						agenciaFechamento.setDespesa(despesa != null ? despesa : BigDecimal.ZERO);

						total = total.add(receita != null ? receita : BigDecimal.ZERO);
						total = total.subtract(despesa != null ? despesa : BigDecimal.ZERO);						

						agenciaFechamento.setVendido(vendido != null ? vendido : BigDecimal.ZERO);
						agenciaFechamento.setTotal(total.abs());

					} else {
						agenciaFechamento.setQtdeDespesa(NumberUtils.INTEGER_ZERO);
						agenciaFechamento.setReceita(BigDecimal.ZERO);
						agenciaFechamento.setDespesa(BigDecimal.ZERO);
						agenciaFechamento.setVendido(vendido != null ? vendido : BigDecimal.ZERO);
						agenciaFechamento.setTotal(total.abs());
					}

					lsDadosRelatorio.add(agenciaFechamento);
				}

				if (lsDadosRelatorio.size() > 0) {

					setLsDadosRelatorio(lsDadosRelatorio);
				}

			}
		});
	}

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

	@Override
	protected void processaParametros() throws Exception {
	}

	private String carregarDadosTotaisdeVenda(String puntoVenta) {

		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT                                                                                                                                                                             ");
		sql.append("          pv.PUNTOVENTA_ID AS codigo,                                                                                                                                               ");
		sql.append("		      pv.nombpuntoventa AS descricao,                                                                                                                                       ");
		sql.append("                                                                                                                                                                                    ");
		sql.append("		      COALESCE(COUNT(CASE WHEN c.MOTIVOCANCELACION_ID IS NULL and (c.INDREMOTOINVERSO is null or c.INDREMOTOINVERSO =0) THEN c.caja_id  ELSE NULL END),0) AS qtdevendido,   ");
		sql.append("                                                                                                                                                                                    ");
		sql.append("		      COALESCE(COUNT(CASE WHEN c.INDREMOTOINVERSO = 1 THEN 1  ELSE NULL END),0) AS qtdedigitado,                                                                            ");
		sql.append("                                                                                                                                                                                    ");
		sql.append("          COALESCE(COUNT(CASE WHEN c.MOTIVOCANCELACION_ID = 31  THEN 1  ELSE NULL END),0) AS qtdeAnulado,                                                                           ");
		sql.append("		      COALESCE(COUNT(CASE WHEN c.MOTIVOCANCELACION_ID is not null and c.MOTIVOCANCELACION_ID <> 31  THEN 1  ELSE NULL END),0) AS qtdeDevolvido,                             ");
		sql.append("                                                                                                                                                                                    ");
		sql.append("		        COALESCE(SUM(CASE WHEN c.MOTIVOCANCELACION_ID IS NULL and (c.INDREMOTOINVERSO is null or c.INDREMOTOINVERSO =0) THEN (                                              ");
		sql.append("            coalesce(c.IMPORTEOUTROS,0) + coalesce(c.IMPORTEPEDAGIO,0) + coalesce(c.IMPORTESEGURO,0)                                                                                ");
		sql.append("            +coalesce(IMPORTETAXAEMBARQUE ,0)+coalesce(c.preciopagado,0)) ELSE NULL END),0) AS vendido,                                                                             ");
		sql.append("                                                                                                                                                                                    ");
		sql.append("		        COALESCE(SUM(CASE WHEN c.MOTIVOCANCELACION_ID IS NULL and c.INDREMOTOINVERSO = 1 THEN (                                                                             ");
		sql.append("            coalesce(c.IMPORTEOUTROS,0) + coalesce(c.IMPORTEPEDAGIO,0) + coalesce(c.IMPORTESEGURO,0)                                                                                ");
		sql.append("            +coalesce(IMPORTETAXAEMBARQUE ,0)+coalesce(c.preciopagado,0)) ELSE NULL END),0) AS digitado,                                                                            ");
		sql.append("                                                                                                                                                                                    ");
		sql.append("		        COALESCE(SUM(CASE WHEN c.MOTIVOCANCELACION_ID = 31  THEN (                                                                                                          ");
		sql.append("            coalesce(c.IMPORTEOUTROS,0) + coalesce(c.IMPORTEPEDAGIO,0) + coalesce(c.IMPORTESEGURO,0)                                                                                ");
		sql.append("            +coalesce(IMPORTETAXAEMBARQUE ,0)+coalesce(c.preciopagado,0)) ELSE NULL END),0) AS anulado,                                                                             ");
		sql.append("                                                                                                                                                                                    ");
		sql.append("		        COALESCE(SUM(CASE WHEN c.MOTIVOCANCELACION_ID is not null and c.MOTIVOCANCELACION_ID <> 31  THEN (                                                                  ");
		sql.append("            coalesce(c.IMPORTEOUTROS,0) + coalesce(c.IMPORTEPEDAGIO,0) + coalesce(c.IMPORTESEGURO,0)                                                                                ");
		sql.append("            +coalesce(IMPORTETAXAEMBARQUE ,0)+coalesce(c.preciopagado,0)) ELSE NULL END),0) AS devolvido                                                                            ");
		sql.append("                                                                                                                                                                                    ");
		sql.append("                                                                                                                                                                                    ");
		sql.append("		 FROM  CAJA c                                                                                                                                                               ");
		sql.append("		        INNER JOIN PUNTO_VENTA pv ON c.PUNTOVENTA_ID = pv.PUNTOVENTA_ID                                                                                                     ");
		sql.append("            inner join marca m on m.marca_id = c.marca_id                                                                                                                           ");
		sql.append("		 WHERE c.TURNO_ID IS NOT NULL                                                                                                                                               ");
		sql.append("		        AND c.FECCORTE BETWEEN :de AND :ate                                                                    ");
		if (puntoVenta != null && !puntoVenta.equals("-1")) {
			sql.append("        AND c.PUNTOVENTA_ID =:puntoVentaId ");
		}
		sql.append("		        AND c.TIPOVENTA_ID <> 6                                                                                                                                             ");
		sql.append("		        AND c.INDREIMPRESION     = 0                                                                                                                                             ");
		sql.append("		        AND m.empresa_id = :empresaId                                                                                                                                               ");
		sql.append("		 GROUP  BY pv.PUNTOVENTA_ID , pv.nombpuntoventa                                                                                                                             ");
		sql.append("		 ORDER  BY pv.PUNTOVENTA_ID , pv.nombpuntoventa ");

		return sql.toString();

	}

	private String carregaAgenciasComVenda() {

		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT DISTINCT cc.PUNTOVENTA_ID ");
		sql.append(" FROM CONTA_CORRENTE_PTOVTA cc ");
		sql.append(" WHERE cc.FECHOROPERACION BETWEEN :de AND :ate ");
		sql.append(" and cc.EMPRESA_ID = :empresaId ");

		return sql.toString();

	}

	private String carregarDadosReceitaDespesa(String puntoVenta) {

		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT  ");
		sql.append(" 		COALESCE(COUNT(CASE WHEN cdp.IMPORTE < 0 THEN 1 ELSE NULL END),0) as qtdedespesa,     ");
		sql.append(" 		COALESCE(SUM(CASE WHEN cdp.IMPORTE > 0 THEN cdp.IMPORTE ELSE NULL END),0) AS receita,    ");
		sql.append(" 		COALESCE(ABS(SUM(CASE WHEN cdp.IMPORTE < 0 THEN cdp.IMPORTE ELSE NULL END)),0) AS despesa    ");
		sql.append(" 	FROM CAJA_DIVERSOS cd, ");
		sql.append(" 		CAJA_DIVERSOS_PAGO cdp, ");
		sql.append(" 		EVENTO_EXTRA ee ");
		sql.append("    WHERE cd.MOTIVOCANCELACION_ID IS NULL ");
		sql.append("  	 AND ee.EVENTOEXTRA_ID = cd.EVENTOEXTRA_ID ");
		sql.append("   	 AND cdp.CAJADIVERSOS_ID = cd.CAJADIVERSOS_ID ");
		sql.append("   	 AND ee.activo = 1 ");
		sql.append("   	 AND cd.TURNO_ID IS NOT NULL ");
		sql.append("     AND cd.FECCORTE BETWEEN :de AND :ate ");
		if (puntoVenta != null && !puntoVenta.equals("-1")) {
			sql.append("     AND cd.PUNTOVENTA_ID = :puntoVentaId ");
		}
		sql.append("     AND ee.EMPRESA_ID=:empresaId ");

		return sql.toString();

	}

	private String carregarNomeEmpresa() {

		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT  ");
		sql.append(" NOMBEMPRESA  ");
		sql.append(" FROM EMPRESA ");
		sql.append(" WHERE EMPRESA_ID=:empresaId ");

		return sql.toString();

	}
}
