package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.ItemRelatorioVoucher;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

public class RelatorioAnaliticoVoucherCancelados extends Relatorio {

	private static Logger log = LogManager.getLogger(RelatorioAnaliticoVoucherCancelados.class);

	List<ItemRelatorioVoucher> listdata = null;

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

		this.setCustomDataSource(new DataSource(this) {
			@Override
			public void initDados() throws Exception {

				try {
					Date inicio = (Date) parametros.get("inicio");
					Date fim = (Date) parametros.get("fim");
					Empresa empresa = (Empresa) parametros.get("empresa");

					listdata = buscarMovimentosAnaliticos(inicio, fim, empresa.getEmpresaId());

				} catch (SQLException e) {
					log.error("", e);
				}
			}

		});

		this.setCollectionDataSource(new JRBeanCollectionDataSource(listdata));
	}

	public List<ItemRelatorioVoucher> buscarMovimentosAnaliticos(Date inicio, Date fim, Integer empresaId) throws SQLException {

		inicio = DateUtil.inicioFecha(inicio);
		fim = DateUtil.fimFecha(fim);

		NamedParameterStatement stmt = new NamedParameterStatement(getConexao(), getSql());

		stmt.setTimestamp("dataInicial", new java.sql.Timestamp(inicio.getTime()));
		stmt.setTimestamp("dataFinal", new java.sql.Timestamp(fim.getTime()));
		stmt.setInt("empresaId", empresaId);

		ResultSet rset = stmt.executeQuery();
		List<ItemRelatorioVoucher> list = new ArrayList<ItemRelatorioVoucher>();
		while (rset.next()) {
			ItemRelatorioVoucher item = new ItemRelatorioVoucher();

			item.setSituacao(rset.getString("SITUACAO"));
			// item.setCompetenciaEntrega(rset.getString("COMPETENCIA_ENTREGA"));
			item.setCompetenciaVenda(rset.getString("COMPETENCIA_VENDA"));
			item.setCompetenciaCancelamento(rset.getString("COMPETENCIA_CANCELAMENTO"));
			item.setTarifa(rset.getBigDecimal("TARIFA"));
			item.setPedagio(rset.getBigDecimal("PEDAGIO"));
			item.setEmbarque(rset.getBigDecimal("TAXA_EMBARQUE"));
			item.setSeguro(rset.getBigDecimal("SEGURO"));
			item.setQtde(rset.getInt("QTDE"));

			list.add(item);
		}

		if (!getConexao().isClosed())
			getConexao().close();

		return list;
	}

	private String getSql() {

		StringBuilder sQuery = new StringBuilder();
		sQuery.append("SELECT 'CANCELADOS NA COMPETÊNCIA' AS SITUACAO, ");
		sQuery.append("TO_CHAR(B.FECHORVENTA,'MM/YYYY') AS COMPETENCIA_VENDA, ");
		sQuery.append("TO_CHAR(BE.FECHORVENTA,'MM/YYYY') AS COMPETENCIA_CANCELAMENTO, ");
		sQuery.append("SUM(B.PRECIOPAGADO) AS TARIFA, ");
		sQuery.append("SUM(B.IMPORTEPEDAGIO) AS PEDAGIO, ");
		sQuery.append("SUM(B.IMPORTESEGURO) AS SEGURO, ");
		sQuery.append("SUM(B.IMPORTETAXAEMBARQUE) AS TAXA_EMBARQUE, ");
		sQuery.append("COUNT(B.BOLETO_ID) AS QTDE ");
		sQuery.append("FROM BOLETO B ");
		sQuery.append("JOIN BOLETO BE ON B.BOLETO_ID = BE.BOLETOORIGINAL_ID ");
		sQuery.append("WHERE B.TIPOVENTA_ID IN (5,12,18) ");
		sQuery.append("AND BE.FECHORVENTA BETWEEN :dataInicial AND :dataFinal ");
		sQuery.append("AND BE.EMPRESACORRIDA_ID = :empresaId  ");
		sQuery.append("AND B.MOTIVOCANCELACION_ID IN (31,32,10) ");
		sQuery.append("AND BE.INDSTATUSBOLETO = 'C' ");
		sQuery.append("AND TO_DATE(TO_CHAR(B.FECHORVENTA,'MM/YYYY'),'MM/YYYY') <= TO_DATE(TO_CHAR(BE.FECHORVENTA,'MM/YYYY'),'MM/YYYY') ");
		sQuery.append("GROUP BY 'VENDIDO EM COMPETÊNCIA ANTERIOR', ");
		sQuery.append("			TO_CHAR(B.FECHORVENTA,'MM/YYYY'), ");
		sQuery.append("			TO_CHAR(BE.FECHORVENTA,'MM/YYYY') ");
		sQuery.append("ORDER BY SITUACAO, COMPETENCIA_CANCELAMENTO, COMPETENCIA_VENDA ");

		return sQuery.toString();
	}

	@Override
	protected void processaParametros() throws Exception {
	}

}
