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

import com.rjconsultores.ventaboletos.relatorios.utilitarios.ArrayDataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioBilhetesVendidosEstoqueAgenciaBean;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

/**
 * @author Wallace
 *
 */
public class RelatorioBilhetesVendidosEstoqueAgenciaNovoLayout extends Relatorio {
	private List<RelatorioBilhetesVendidosEstoqueAgenciaBean> lsDadosRelatorio;

	public RelatorioBilhetesVendidosEstoqueAgenciaNovoLayout(Map<String, Object> parametros, Connection conexao) throws Exception {
		super(parametros, conexao);

		this.setCustomDataSource(new ArrayDataSource(this) {
			@SuppressWarnings("unused")
			@Override
			public void initDados() throws Exception {

				Connection conexao = this.relatorio.getConexao();
				Map<String, Object> parametros = this.relatorio.getParametros();
				String  pnutoVentasIds = (String) parametros.get("NUMPUNTOVENTA");
				Integer empresa = (Integer) parametros.get("EMPRESA_ID");
				Date datainicial = (Date) parametros.get("DATA_INICIAL");
				Date dataFinal = (Date) parametros.get("DATA_FINAL");
				Integer aidfTipoId = (Integer) parametros.get("AIDFTIPO_ID");
				Integer aidfId = (Integer) parametros.get("AIDF_ID");
				
				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql(pnutoVentasIds, aidfTipoId, aidfId));
								
				stmt.setInt("EMPRESA_ID", empresa);
				stmt.setString("dataInicio", DateUtil.getStringDate(datainicial, "dd/MM/yyyy") + " 00:00:00");
				stmt.setString("dataFinal", DateUtil.getStringDate(dataFinal, "dd/MM/yyyy") + " 23:59:59");
				if(aidfTipoId != null) {
					stmt.setInt("aidfTipo",aidfTipoId);
				}
				if(aidfId != null) {
					stmt.setInt("aidfId",aidfId);
				}

				ResultSet rset = stmt.executeQuery();
				List<RelatorioBilhetesVendidosEstoqueAgenciaBean> lsTemp = new ArrayList<>();
				List<RelatorioBilhetesVendidosEstoqueAgenciaBean> lsRelatorioBilhetesVendidosEstoqueAgenciaBean = new ArrayList<>();
				List<RelatorioBilhetesVendidosEstoqueAgenciaBean> lsRelatorioBilhetesVendidosEstoqueAgenciaBeanGeradoSequencia = new ArrayList<>();
				while (rset.next()) {

					Map<String, Object> dataResult = new HashMap<String, Object>();
									
					RelatorioBilhetesVendidosEstoqueAgenciaBean bean  = new RelatorioBilhetesVendidosEstoqueAgenciaBean();
					bean.setAidfId(rset.getInt("aidfId"));
					bean.setNombpuntoventa(rset.getString("descpuntoVenta"));
					bean.setSerie(rset.getString("serie"));
					bean.setFechorVenta(DateUtil.getDateFromString(rset.getString("dataVenda"), "ddMMyyyy"));
					bean.setChave(rset.getString("chave"));
					bean.setFolio(rset.getString("folio"));
					bean.setNomeEmpresa(rset.getString("nomeEmpresa"));
					bean.setTipoEvento(rset.getString("tipoAidf"));
					bean.setValorContabil((BigDecimal)rset.getObject("valorContabil"));
					bean.setOrigem(rset.getString("origem"));
					bean.setDestino(rset.getString("destino"));
					bean.setEstado(rset.getString("estado"));
					lsRelatorioBilhetesVendidosEstoqueAgenciaBean.add(bean);
					
					this.dados.add(dataResult);

				}

				this.resultSet = rset;
				setLsDadosRelatorio(lsRelatorioBilhetesVendidosEstoqueAgenciaBean);
			}
		});
	}
	
	public void setLsDadosRelatorio(List<RelatorioBilhetesVendidosEstoqueAgenciaBean> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
	}
	
	public List<RelatorioBilhetesVendidosEstoqueAgenciaBean> getLsDadosRelatorio() {
		return lsDadosRelatorio;
	}

	private String sql(String puntoVentasId, Integer aidfTipoId, Integer aidfId) {
		
		StringBuilder sql = new StringBuilder();
		sql.append("  SELECT TB.aidfId AS aidfId,                               ");
		sql.append("         TB.descpuntoVenta AS descpuntoVenta,               ");
		sql.append("         TB.SERIE AS serie,                                 ");
		sql.append("         TB.puntoventaId,                                   ");
		sql.append("         TB.dataVenda AS dataVenda,                         ");
		sql.append("         TB.chave AS chave,                                 ");
		sql.append("         TB.nomeEmpresa AS nomeEmpresa,                     ");
		sql.append("         TB.folio AS folio,                                 ");
		sql.append("         TB.tipoAidf AS tipoAidf,                           ");
		sql.append("         tb.VALOR AS valorContabil,                         ");
		sql.append("         tb.origen as origem,                               ");
		sql.append("         tb.destino  as destino,                             ");
		sql.append("         tb.estado  as estado                                ");
		sql.append("  FROM                                                      ");
		sql.append("    (SELECT DAB.AIDF_ID AS aidfId,                          ");
		sql.append("            pv.nombpuntoventa AS descpuntoVenta,            ");
		sql.append("            c.numseriepreimpresa AS SERIE,                  ");
		sql.append("            c.puntoventa_id AS puntoventaId,                ");
		sql.append("            to_char(c.fechorventa, 'ddMMyyyy') AS dataVenda,");
		sql.append("            DAB.AIDF_ID || c.numseriepreimpresa || c.puntoventa_id || to_char(c.fechorventa, 'ddMMyyyy') AS chave, ");
		sql.append("            em.nombEmpresa AS nomeEmpresa, ");
		sql.append("            c.numfoliopreimpreso AS folio, ");
		sql.append("            AIT.DESCTIPO tipoAidf,");
		sql.append("            COALESCE(COALESCE(c.PRECIOPAGADO, 0) + COALESCE(c.IMPORTETAXAEMBARQUE, 0) + COALESCE(c.IMPORTESEGURO, 0) + COALESCE(c.IMPORTEPEDAGIO, 0) + COALESCE(c.IMPORTEOUTROS, 0), 0) AS VALOR, ");
		sql.append("            po.descparada AS origen,   ");
		sql.append("            pd.descparada AS destino, est.nombestado as estado   ");
		sql.append("     FROM caja c,                      ");
		sql.append("          PUNTO_VENTA PV,              ");
		sql.append("          EMPRESA EM,                  ");
		sql.append("          parada po,                   ");
		sql.append("          ciudad co,                   ");
		sql.append("          parada pd,                   ");
		sql.append("          ciudad cd,                   ");
		sql.append("          estado est,                  ");
		sql.append("          AIDF_TIPO AIT,               ");
		sql.append("          AIDF AI,                     ");
		sql.append("          ABASTO_BOLETO AB             ");
		sql.append("     LEFT JOIN DET_ABASTO_BOLETO DAB ON (AB.ABASTOBOLETO_ID = DAB.ABASTOBOLETO_ID) ");
		sql.append(" WHERE fechorventa  BETWEEN TO_DATE(:dataInicio,'dd/mm/yyyy hh24:mi:ss') AND TO_DATE(:dataFinal,'dd/mm/yyyy hh24:mi:ss')                                               ");
		sql.append("       AND TO_NUMBER(c.NUMFOLIOPREIMPRESO) BETWEEN TO_NUMBER(DAB.NUMFOLIOINICIAL) AND TO_NUMBER(DAB.NUMFOLIOFINAL) ");
//		sql.append("       AND c.PUNTOVENTA_ID = AB.PUNTOVENTA_ID      ");
		if (puntoVentasId != null && !puntoVentasId.equals("-1")) {
			sql.append(" AND (c.PUNTOVENTA_ID in("+puntoVentasId+ ") or  AB.PUNTOVENTA_ID in("+puntoVentasId+") ) 										                                   ");
		}		
		sql.append("       AND EM.EMPRESA_ID = AB.EMPRESA_ID           ");
		sql.append("       AND c.PUNTOVENTA_ID = PV.PUNTOVENTA_ID      ");
		sql.append("       AND DAB.AIDF_ID = AI.AIDF_ID                ");
		sql.append(aidfTipoId != null ?  " AND (AI.AIDFTIPO_ID =:aidfTipo  AND AIT.AIDFTIPO_ID = AI.AIDFTIPO_ID) " : "  AND AIT.AIDFTIPO_ID = AI.AIDFTIPO_ID                                ");
		sql.append(aidfId != null ?  " AND (AI.AIDF_ID =:aidfId  AND DAB.AIDF_ID = AI.AIDF_ID) " : "  AND DAB.AIDF_ID = AI.AIDF_ID  ");
		sql.append("       AND EM.EMPRESA_ID =:EMPRESA_ID         and (c.NUMSERIEPREIMPRESA = dab.NUMSERIEPREIMPRESA OR (c.NUMSERIEPREIMPRESA IS NULL and dab.NUMSERIEPREIMPRESA is null))      ");
		sql.append("       AND po.parada_id = c.origen_id              ");
		sql.append("       AND co.ciudad_id = po.ciudad_id             ");
		sql.append("       AND pd.parada_id = c.destino_id             ");
		sql.append("       AND cd.ciudad_id = pd.ciudad_id             ");
		sql.append("       AND est.estado_id = co.estado_id            ");
		sql.append("       and c.INDSTATUSBOLETO = 'V' AND c.MOTIVOCANCELACION_ID IS NULL AND AI.ACTIVO = 1 AND AIT.ACTIVO = 1        ");
		sql.append("     GROUP BY DAB.AIDF_ID,                         ");
		sql.append("              c.numseriepreimpresa,                ");
		sql.append("              c.numfoliopreimpreso,                ");
		sql.append("              c.puntoventa_id,                     ");
		sql.append("              to_char(c.fechorventa, 'ddMMyyyy'),  ");
		sql.append("              pv.nombpuntoventa,                   ");
		sql.append("              em.nombEmpresa,                      ");
		sql.append("              AIT.DESCTIPO,                        ");
		sql.append("              c.preciopagado,                      ");
		sql.append("              c.IMPORTETAXAEMBARQUE,               ");
		sql.append("              c.IMPORTESEGURO,                     ");
		sql.append("              c.importepedagio,                    ");
		sql.append("              c.IMPORTEOUTROS,                     ");
		sql.append("              po.descparada,                       ");
		sql.append("              pd.descparada, est.nombestado         ");
		sql.append("     UNION ALL SELECT DAB.AIDF_ID AS aidfId,        ");
		sql.append("                      pv.nombpuntoventa AS descpuntoVenta, ");
		sql.append("                      c.numseriepreimpresa AS SERIE, ");
		sql.append("                      c.puntoventa_id AS puntoventaId, ");
		sql.append("                      to_char(c.FECHORVTA, 'ddMMyyyy') AS dataVenda, ");
		sql.append("                      DAB.AIDF_ID || c.numseriepreimpresa || c.puntoventa_id || to_char(c.FECHORVTA, 'ddMMyyyy') AS chave, ");
		sql.append("                      em.nombEmpresa AS nomeEmpresa, ");
		sql.append("                      c.numfoliopreimpreso AS folio,");
		sql.append("                      AIT.DESCTIPO tipoAidf,        ");
		sql.append("                      c.PRECIO,                     ");
		sql.append("                      ' ' AS origen,                ");
		sql.append("                      ' ' AS desgtino,               ");
		sql.append("                      ' ' AS estado                  ");
		sql.append("     FROM caja_diversos c,                          ");
		sql.append("          PUNTO_VENTA PV,                           ");
		sql.append("          EMPRESA EM,                               ");
		sql.append("          AIDF AI,                                  ");
		sql.append("          AIDF_TIPO AIT,                            ");
		sql.append("          ABASTO_BOLETO AB                          ");
		sql.append("     LEFT JOIN DET_ABASTO_BOLETO DAB ON (AB.ABASTOBOLETO_ID = DAB.ABASTOBOLETO_ID) ");
		sql.append(" WHERE FECHORVTA  BETWEEN TO_DATE(:dataInicio,'dd/mm/yyyy hh24:mi:ss') AND TO_DATE(:dataFinal,'dd/mm/yyyy hh24:mi:ss')                                                 ");
		sql.append("       AND TO_NUMBER(c.NUMFOLIOPREIMPRESO) BETWEEN TO_NUMBER(DAB.NUMFOLIOINICIAL) AND TO_NUMBER(DAB.NUMFOLIOFINAL) ");
//		sql.append("       AND c.PUNTOVENTA_ID = AB.PUNTOVENTA_ID     ");
		if (puntoVentasId != null && !puntoVentasId.equals("-1")) {
			sql.append(" AND (c.PUNTOVENTA_ID in("+puntoVentasId+ ") or  AB.PUNTOVENTA_ID in("+puntoVentasId+") ) 										                                   ");
		}		
		sql.append("       AND EM.EMPRESA_ID = AB.EMPRESA_ID          ");
		sql.append("       AND c.PUNTOVENTA_ID = PV.PUNTOVENTA_ID     ");
		sql.append("       AND DAB.AIDF_ID = AI.AIDF_ID  AND AI.ACTIVO = 1 AND AIT.ACTIVO = 1             ");
		sql.append(aidfTipoId != null ?  " AND (AI.AIDFTIPO_ID =:aidfTipo  AND AIT.AIDFTIPO_ID = AI.AIDFTIPO_ID) " : "  AND AIT.AIDFTIPO_ID = AI.AIDFTIPO_ID                                ");
		sql.append(aidfId != null ?  " AND (AI.AIDF_ID =:aidfId  AND DAB.AIDF_ID = AI.AIDF_ID) " : "  AND DAB.AIDF_ID = AI.AIDF_ID  ");
		sql.append("    AND EM.EMPRESA_ID =:EMPRESA_ID     and (c.NUMSERIEPREIMPRESA = dab.NUMSERIEPREIMPRESA OR (c.NUMSERIEPREIMPRESA IS NULL and dab.NUMSERIEPREIMPRESA is null))                ");
		sql.append("     GROUP BY DAB.AIDF_ID,                        ");
		sql.append("              c.numseriepreimpresa,               ");
		sql.append("              c.numfoliopreimpreso,               ");
		sql.append("              c.puntoventa_id,                    ");
		sql.append("              to_char(c.FECHORVTA, 'ddMMyyyy'),   ");
		sql.append("              pv.nombpuntoventa,                  ");
		sql.append("              em.nombEmpresa,                     ");
		sql.append("              AIT.DESCTIPO,                       ");
		sql.append("              c.PRECIO)TB                         ");
		sql.append("  ORDER BY to_number(TB.FOLIO)                    ");
		
		return sql.toString();
		
		
	}

	@Override
	protected void processaParametros() throws Exception {

	}

}
