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

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

public class RelatorioCaixaOrgaoConcedente extends Relatorio {

	private static final int TODOS = -1;
	private List<RelatorioCaixaOrgaoConcedenteBean> lsDadosRelatorio;
	private static Logger log = LogManager.getLogger(RelatorioCaixaOrgaoConcedente.class);

	public RelatorioCaixaOrgaoConcedente(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 fecInicio = null;
					if (parametros.get("fecInicio") != null) {
						fecInicio = parametros.get("fecInicio").toString() + " 00:00:00";
					}
					String fecFinal = null;
					if (parametros.get("fecFinal") != null) {
						fecFinal = parametros.get("fecFinal").toString() + " 23:59:59";
					}

					Integer orgaoConcedenteId = Integer.parseInt(parametros.get("orgao_concedente_id").toString());
					Integer puntoVentaId = Integer.parseInt(parametros.get("puntoVentaId").toString());
					Integer usuarioId = Integer.parseInt(parametros.get("usuarioId").toString());
					String empresa = parametros.get("empresa") != null ? parametros.get("empresa").toString() : "";

					String sql = getSql(fecInicio, fecFinal, orgaoConcedenteId, puntoVentaId, usuarioId, empresa);

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

					if (fecInicio != null) {
						stmt.setTimestamp("fecInicio", new java.sql.Timestamp(sdf.parse(fecInicio).getTime()));
					}

					if (fecFinal != null) {
						stmt.setTimestamp("fecFinal", new java.sql.Timestamp(sdf.parse(fecFinal).getTime()));
					}

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

					if (orgaoConcedenteId != null && Integer.valueOf(orgaoConcedenteId).intValue() != TODOS) {
						stmt.setInt("orgao_concedente_id", orgaoConcedenteId);
					}
					if (puntoVentaId != null && Integer.valueOf(puntoVentaId).intValue() != TODOS) {
						stmt.setInt("puntoVentaId", puntoVentaId);
					}
					if (usuarioId != null && Integer.valueOf(usuarioId).intValue() != TODOS) {
						stmt.setInt("usuarioId", usuarioId);
					}
					ResultSet rset = null;

					rset = stmt.executeQuery();

					lsDadosRelatorio = new ArrayList<RelatorioCaixaOrgaoConcedenteBean>();

					while (rset.next()) {
						RelatorioCaixaOrgaoConcedenteBean bean = new RelatorioCaixaOrgaoConcedenteBean();
						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.setCategoria(rset.getString("categoria"));
						bean.setDescOrgaoConcedente(rset.getString("descOrgao"));
						bean.setOrgaoConcedenteId(rset.getInt("orgaoConcedenteId"));
						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 Relatório de Caixa Orgão Concedente: \n" + e);
					e.printStackTrace();
					throw e;
				}
			}
		});
	}

	public void setLsDadosRelatorio(List<RelatorioCaixaOrgaoConcedenteBean> 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, Integer orgaoConcedenteId, Integer puntoVentaId, Integer usuarioId, String empresa) {

		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT 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("   orgaoConcedenteId,");
		sql.append("   descOrgao,");
		sql.append("   categoria,");
		sql.append("   tipo");
		sql.append(" FROM");
		sql.append("   ( SELECT DISTINCT c.TIPOVENTA_ID AS tipoVenda,");
		sql.append("     c.caja_id,");
		sql.append("     OC.ORGAOCONCEDENTE_ID              AS orgaoConcedenteId,");
		sql.append("     OC.DESCORGAO                       AS descOrgao,");
		sql.append("     cat.DESCCATEGORIA                  AS categoria,");
		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("     ( (");
		sql.append("     CASE");
		sql.append("       WHEN c.MOTIVOCANCELACION_ID IS NULL");
		sql.append("       AND c.indreimpresion         = 0");
		sql.append("       AND (c.indstatusboleto = 'V' or c.indstatusboleto = 'T' )");
		sql.append("       THEN 'VENDA'");
		sql.append("       WHEN c.indreimpresion        = 0");
		sql.append("       AND (c.MOTIVOCANCELACION_ID IS NOT NULL");
		//Não devoluções (Cancelamentos)
		sql.append("       AND c.MOTIVOCANCELACION_ID NOT IN (32,34, 35, 36,37, 99))");
		sql.append("       THEN 'CANCELADO'");
		sql.append("       WHEN ((c.indreimpresion      = 0");
		sql.append("         AND c.MOTIVOCANCELACION_ID IS NOT NULL");
		//Devoluções
		sql.append("         AND c.MOTIVOCANCELACION_ID IN (32,36,37)))");
		//sql.append("       OR c.MOTIVOCANCELACION_ID  = 99)");
		sql.append("       THEN 'DEVOLUCAO'");
		//Quitação OCD
		sql.append("       WHEN c.indreimpresion           = 0 ");
		sql.append("	      AND (c.MOTIVOCANCELACION_ID    IS NOT NULL ");
		sql.append("          AND c.MOTIVOCANCELACION_ID IN (35)) ");
		sql.append("       THEN 'QUITACAO OCD' ");
		
		sql.append("     END) ) AS tipo");
		sql.append("   FROM caja c");
		sql.append("   INNER JOIN MARCA ma");
		sql.append("   ON c.marca_id = ma.marca_id");
		sql.append("   INNER JOIN EMPRESA emp");
		sql.append("   ON ma.empresa_id = emp.empresa_id");
		sql.append("   INNER JOIN CATEGORIA cat");
		sql.append("   ON c.categoria_id = cat.categoria_id");
		sql.append("   LEFT JOIN TIPO_VENTA tv");
		sql.append("   ON tv.TIPOVENTA_ID = c.TIPOVENTA_ID");
		sql.append("   LEFT JOIN RUTA r");
		sql.append("   ON r.RUTA_ID = c.RUTA_ID");
		sql.append("   AND r.ACTIVO = 1");
		sql.append("   LEFT JOIN ORGAO_CONCEDENTE OC");
		sql.append("   ON r.ORGAOCONCEDENTE_ID = OC.ORGAOCONCEDENTE_ID");
		sql.append("   AND OC.ACTIVO           = 1");
		sql.append("   WHERE c.ACTIVO          = 1");
		//Não deve considerar Reimpressão do bilhete");
		sql.append("   AND (c.INDREIMPRESION       = 0)");
		//sql.append("   OR (c.INDREIMPRESION        = 1 AND  c.MOTIVOCANCELACION_ID =99))");
		sql.append("  AND c.feccorte BETWEEN :fecInicio AND :fecFinal");
		if (orgaoConcedenteId != null && orgaoConcedenteId != TODOS) {
			sql.append("  AND OC.ORGAOCONCEDENTE_ID = :orgao_concedente_id ");
		}
		if (puntoVentaId != null && puntoVentaId != TODOS) {
			sql.append("  AND c.puntoventa_id = :puntoVentaId ");
		}
		if (usuarioId != null && usuarioId != TODOS) {
			sql.append("  AND c.usuario_id = :usuarioId ");
		}
		sql.append("  AND c.empresacorrida_id = :empresa_id");
		sql.append("  ) dados");
		sql.append(" GROUP BY ");
		sql.append("  orgaoConcedenteId,");
		sql.append("  categoria,");
		sql.append("  descOrgao,");
		sql.append("  tipo ");
		sql.append(" ORDER BY ");
		sql.append("  orgaoConcedenteId,");
		sql.append("  categoria,");
		sql.append("  descOrgao, ");
		sql.append("  tipo ");

		return sql.toString();
	}
}