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 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.RelatorioOperacionalFinanceiroBean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

public class RelatorioOperacionalFinanceiro extends Relatorio {

	private List<RelatorioOperacionalFinanceiroBean> lsDadosRelatorio;
	private static Logger log = LogManager.getLogger(RelatorioOperacionalFinanceiro.class);

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

		this.setCustomDataSource(new DataSource(this) {

			@Override
			public void initDados() throws Exception {
				try {
					Connection conexao = this.relatorio.getConexao();
	
					Map<String, Object> parametros = this.relatorio.getParametros();
	
					String fecInicioVenda = null;
					if (parametros.get("fecInicioVenda") != null) {
						fecInicioVenda = parametros.get("fecInicioVenda").toString() + " 00:00:00";
					}
					String fecFinalVenda = null;
					if (parametros.get("fecFinalVenda") != null) {
						fecFinalVenda = parametros.get("fecFinalVenda").toString() + " 23:59:59";
					}
	
					String tramoIds = parametros.get("tramoIds").toString();
					String linhaIds = parametros.get("linhaIds").toString();
					String empresa = parametros.get("empresa") != null ? parametros.get("empresa").toString() : "";
					String moeda = parametros.get("MOEDA_ID") != null ? parametros.get("MOEDA_ID").toString() : "";
					
					String sql = getSql(fecInicioVenda, fecFinalVenda, linhaIds, tramoIds, empresa);
	
					SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
					NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
	
					if (fecInicioVenda != null) {
						stmt.setTimestamp("fecInicioVenda", new java.sql.Timestamp(sdf.parse(fecInicioVenda).getTime()));
					}
	
					if (fecFinalVenda != null) {
						stmt.setTimestamp("fecFinalVenda", new java.sql.Timestamp(sdf.parse(fecFinalVenda).getTime()));
					}
	
					if (empresa != null && !empresa.equals("")) {
						stmt.setInt("empresa_id", Integer.parseInt(empresa));
					}
					
					stmt.setInt("MOEDA_ID", Integer.parseInt(moeda));
	
					ResultSet rset = null;
	
					rset = stmt.executeQuery();
	
					lsDadosRelatorio = new ArrayList<RelatorioOperacionalFinanceiroBean>();
	
					while (rset.next()) {
						RelatorioOperacionalFinanceiroBean bean = new RelatorioOperacionalFinanceiroBean();
						
						bean.setDescRuta(rset.getString("descRuta"));
						bean.setRuta(rset.getInt("ruta"));
						bean.setDescTramo(rset.getString("descTramo"));
						bean.setQtde(rset.getInt("qtde"));
						bean.setTarifa(rset.getBigDecimal("tarifa"));
						bean.setTaxaembarque(rset.getBigDecimal("taxaembarque"));
						bean.setPedagio(rset.getBigDecimal("pedagio"));
						bean.setOutros(rset.getBigDecimal("outros"));
						bean.setSeguro(rset.getBigDecimal("seguro"));
						bean.setTipo(rset.getString("tipo"));
						
						lsDadosRelatorio.add(bean);
					}
					
					log.info("TAMANHO == null ? " + lsDadosRelatorio == null);
						
					if (lsDadosRelatorio.size() > 0) {
						log.info("TAMANHO DA LISTA: " + lsDadosRelatorio.size());
						setLsDadosRelatorio(lsDadosRelatorio);
					}
				
				} catch (Exception e) {
					log.error("Erro na geração do relatorio Operacional Financeiro: \n" + e);
					e.printStackTrace();
					throw e; 
				}
			}
		});
	}

	public void setLsDadosRelatorio(List<RelatorioOperacionalFinanceiroBean> lsDadosRelatorio) {
		log.info("Setando dados do relatorio Operacional Financeiro ");
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
		log.info("depois de Setar dados do relatorio Operacional Financeiro ");
	}

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSql(String fecInicioVenda, String fecFinalVenda, String linha, String tramo, String empresa) {

		StringBuilder sql = new StringBuilder();

		sql.append("  SELECT ");
		sql.append("     origem || ' x ' ||  destino as DESCTRAMO, ");
		sql.append("     DESCRUTA, ");
		sql.append("     count(caja_id) as qtde, ");
		sql.append("     SUM(tarifa) as tarifa,  ");
		sql.append("     SUM(taxaembarque) as taxaembarque,  ");
		sql.append("     SUM(pedagio) as pedagio,  ");
		sql.append("     SUM(outros) as outros,  ");
		sql.append("     SUM(seguro) as seguro, ");
		sql.append("     tipo, ");
		sql.append("     ruta_id as ruta ");
		sql.append("  from ( ");
		sql.append("     SELECT  ");
		sql.append("      	 distinct ");
		sql.append("         ORI.DESCPARADA  as origem, ");
		sql.append("         DES.DESCPARADA  as destino, ");
		sql.append("         r.ruta_id, ");
		sql.append("         r.DESCRUTA, ");
		sql.append("         c.TIPOVENTA_ID as tipoVenda, ");
		sql.append("         c.caja_id, ");
		sql.append("         COALESCE(c.PRECIOPAGADO, 0) as tarifa,  ");
		sql.append("         COALESCE(c.IMPORTETAXAEMBARQUE, 0) as taxaembarque,  ");
		sql.append("         COALESCE(c.IMPORTEPEDAGIO, 0) as pedagio,  ");
		sql.append("         COALESCE(c.IMPORTEOUTROS, 0) as outros,  ");
		sql.append("         COALESCE(c.IMPORTESEGURO, 0) as seguro, ");
		sql.append("         (case  ");
		sql.append("           when (r.INDSENTIDOIDA = 1)  ");
		sql.append("           then 'I'  ");
		sql.append("           else 'V'  ");
		sql.append("         end)  as sentido, ");
		sql.append("         ( ");
		sql.append("           (  ");
		sql.append("            CASE  ");
		sql.append("              WHEN c.MOTIVOCANCELACION_ID IS NULL AND c.indreimpresion = 0 ");
		sql.append("              AND c.FECVENTADIGITA IS NULL ");
		sql.append("              AND (c.PORCCATEGORIA <> 100 OR  c.PORCCATEGORIA IS NULL ) ");
		sql.append("              AND (c.INDREMOTOINVERSO IS NULL OR c.INDREMOTOINVERSO =0) ");
		sql.append("              AND (c.INDSTATUSBOLETO <> 'E' AND c.TIPOVENTA_ID not in (5,12,18,99))  ");
		sql.append("              THEN 'VENDA NORMAL'  ");
		sql.append("               ");
		sql.append("              WHEN c.MOTIVOCANCELACION_ID IS NULL AND c.indreimpresion = 0 ");
		sql.append("              AND c.FECVENTADIGITA IS NOT NULL ");
		sql.append("              AND (c.PORCCATEGORIA <> 100 OR  c.PORCCATEGORIA IS NULL ) ");
		sql.append("              AND (c.INDREMOTOINVERSO IS NULL OR c.INDREMOTOINVERSO =0) ");
		sql.append("              AND (c.INDSTATUSBOLETO <> 'E' AND c.TIPOVENTA_ID not in (5,12,18,99))  ");
		sql.append("              THEN 'VENDA TRANSITO'  ");
		sql.append("               ");
		sql.append("              WHEN c.MOTIVOCANCELACION_ID IS NULL AND c.indreimpresion = 0 ");
		sql.append("              AND c.FECVENTADIGITA IS NULL ");
		sql.append("              AND c.PORCCATEGORIA > 0 ");
		sql.append("              AND (c.INDREMOTOINVERSO     IS NULL OR c.INDREMOTOINVERSO        =0) ");
		sql.append("              AND (c.INDSTATUSBOLETO <> 'E' AND c.TIPOVENTA_ID not in (5,12,18,99))  ");
		sql.append("              THEN cat.DESCCATEGORIA ");
		sql.append("               ");
		sql.append("              WHEN c.MOTIVOCANCELACION_ID IS NULL AND c.indreimpresion = 0 ");
		sql.append("              AND c.FECVENTADIGITA IS NOT NULL ");
		sql.append("              AND ( c.PORCCATEGORIA <> 100 OR  c.PORCCATEGORIA IS NULL ) ");
		sql.append("              AND (c.INDREMOTOINVERSO IS NULL OR c.INDREMOTOINVERSO =0)");
		sql.append("              AND (c.INDSTATUSBOLETO <> 'E' AND c.TIPOVENTA_ID in (9,39))  ");
		sql.append("              THEN 'VENDA ANTECIPADA'  ");
		sql.append("               ");
		sql.append("              WHEN c.MOTIVOCANCELACION_ID IS NULL AND c.indreimpresion = 0 ");
		sql.append("              AND c.FECVENTADIGITA IS NULL ");
		sql.append("              AND ( c.PORCCATEGORIA <> 100 OR  c.PORCCATEGORIA IS NULL ) ");
		sql.append("              AND (c.INDREMOTOINVERSO IS NULL OR c.INDREMOTOINVERSO =0) ");
		sql.append("              AND (c.INDSTATUSBOLETO <> 'E' AND c.TIPOVENTA_ID in (99))  ");
		sql.append("              THEN 'VENDA EMBARCADA'  ");
		sql.append("               ");		
		sql.append("              WHEN c.MOTIVOCANCELACION_ID IS NULL AND c.indreimpresion = 0 ");
		sql.append("              AND (c.INDSTATUSBOLETO = 'V' AND c.TIPOVENTA_ID = 5)  ");
		sql.append("              THEN 'VENDA CENTRAL TELEFONICA'  ");
		sql.append("               ");
		sql.append("              WHEN c.MOTIVOCANCELACION_ID IS NULL AND c.indreimpresion = 0 ");
		sql.append("              AND (c.INDSTATUSBOLETO = 'V' AND c.TIPOVENTA_ID = 18)  ");
		sql.append("              THEN 'VENDA PRE-PAGA'  ");
		sql.append("               ");
		sql.append("              WHEN c.MOTIVOCANCELACION_ID IS NULL  AND c.indreimpresion = 1 AND c.MOTIVOREIMPRESION_ID IS NULL");
		sql.append("              AND (c.INDSTATUSBOLETO = 'E' AND c.TIPOVENTA_ID in (5,12,18))  ");
		sql.append("              THEN 'IMPRESSAO POSTERIOR'  ");
		sql.append("               ");		
		sql.append("              WHEN c.MOTIVOCANCELACION_ID IS NULL AND c.indreimpresion = 0 ");
		sql.append("              AND c.INDSTATUSBOLETO = 'V' AND c.TIPOVENTA_ID = 12  ");
		sql.append("              THEN 'VENDA INTERNET' ");
		sql.append("               ");
		sql.append("              WHEN c.MOTIVOCANCELACION_ID IS NOT NULL AND c.indreimpresion = 0 ");
		sql.append("		     THEN 'CANCELADO' ");
		
		sql.append("              WHEN c.INDREIMPRESION = 1 and c.MOTIVOREIMPRESION_ID = 99 ");
		sql.append("		     THEN 'REIMPRESSO' ");
		
		sql.append("		   END)  ");
		sql.append("    ) AS tipo ");
		sql.append("FROM caja c  ");
		sql.append("  INNER JOIN MARCA ma on c.marca_id = ma.marca_id  ");
		sql.append("  INNER JOIN EMPRESA emp on ma.empresa_id = emp.empresa_id  ");
		sql.append("  INNER JOIN CATEGORIA cat on c.categoria_id = cat.categoria_id ");
		sql.append("  LEFT JOIN TIPO_VENTA tv ON tv.TIPOVENTA_ID = c.TIPOVENTA_ID  ");
		sql.append("  LEFT JOIN RUTA r ON r.RUTA_ID = c.RUTA_ID and r.ACTIVO = 1 ");
		sql.append("  LEFT JOIN CORRIDA cor ON c.CORRIDA_ID = cor.CORRIDA_ID and cor.FECCORRIDA = c.FECCORRIDA and cor.ACTIVO = 1 ");
		sql.append("  LEFT JOIN CORRIDA_TRAMO ct ON ct.CORRIDA_ID = cor.CORRIDA_ID and ct.FECCORRIDA = cor.FECCORRIDA and ct.ACTIVO = 1 ");
		sql.append("  LEFT JOIN TRAMO t ON t.TRAMO_ID = ct.TRAMO_ID and t.ACTIVO = 1 ");
		sql.append("  LEFT JOIN parada ORI ON ORI.parada_id = c.origen_id ");
		sql.append("  LEFT JOIN parada DES ON DES.parada_id = c.destino_id ");
		sql.append(" where c.ACTIVO = 1  ");
		sql.append("    AND c.tipoventa_id <> 6 ");
		//sql.append("    AND c.indreimpresion = 0 ");
		sql.append("    AND c.feccorte BETWEEN :fecInicioVenda AND :fecFinalVenda ");
		sql.append("    AND NVL(c.MONEDA_ID, 1) = :MOEDA_ID ");

		if (tramo != null && !tramo.equals("Todas") ) {
			sql.append(" AND t.TRAMO_ID in (").append(tramo).append(")  ");
		}

		if (linha != null && !linha.equals("Todas")) {
			sql.append(" AND r.ruta_id in (").append(linha).append(")  ");
		}

		if (!empresa.isEmpty()) {
			sql.append("AND c.empresacorrida_id = :empresa_id   ");
		}

		sql.append("  ) dados  ");
		sql.append("  GROUP BY  ");
		sql.append("     origem, ");
		sql.append("     destino,  ");
		sql.append("     descruta,  ");
		sql.append("     tipo, ");
		sql.append("     ruta_id ");
		sql.append(" ORDER BY descruta, origem, destino, tipo ");
		
		return sql.toString();
	}
}