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 RelatorioAnaliticoVoucher extends Relatorio {

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

	List<ItemRelatorioVoucher> listdata = null;

	public RelatorioAnaliticoVoucher(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.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();

		/* VENDIDO E IMPRESSO NA MESMA COMPETENCIA */
		sQuery.append("SELECT 'VENDIDO E ENTREGUE MESMA COMPETÊNCIA' AS SITUACAO, ")
				.append("  TO_CHAR(BE.FECCREACION,'MM/YYYY') AS COMPETENCIA_ENTREGA, ")
				.append("  TO_CHAR(B.FECCREACION,'MM/YYYY') AS COMPETENCIA_VENDA, ")
				.append("  SUM(B.PRECIOPAGADO) AS TARIFA, ")
				.append("  SUM(B.IMPORTEPEDAGIO) AS PEDAGIO, ")
				.append("  SUM(B.IMPORTESEGURO) AS SEGURO, ")
				.append("  SUM(B.IMPORTETAXAEMBARQUE) AS TAXA_EMBARQUE, ")
				.append("  COUNT(B.BOLETO_ID) AS QTDE ")
				.append("FROM BOLETO B ")
				.append("JOIN BOLETO BE ON B.BOLETO_ID = BE.BOLETOORIGINAL_ID ")
				.append("               AND BE.FECCREACION BETWEEN :dataInicial AND :dataFinal ")
				.append("               AND BE.INDSTATUSBOLETO = 'E' ")
				.append("WHERE B.TIPOVENTA_ID IN (5,12,18) ")
				.append("  AND B.FECCREACION BETWEEN :dataInicial AND :dataFinal ")
				.append("  AND B.EMPRESACORRIDA_ID = :empresaId ")
				.append("  AND B.MOTIVOCANCELACION_ID = 16 ")
				.append("  AND B.INDSTATUSBOLETO = 'V' ")
				.append("GROUP BY 'VENDIDO E ENTREGUE MESMA COMPETÊNCIA', ")
				.append("	TO_CHAR(B.FECCREACION,'MM/YYYY'), ")
				.append("	TO_CHAR(BE.FECCREACION,'MM/YYYY') ");

		sQuery.append("UNION ");

		/* VENDIDO EM COMPETÊNCIA ANTERIOR */
		sQuery.append("SELECT 'VENDIDO EM COMPETÊNCIA ANTERIOR' AS SITUACAO, ")
				.append("  TO_CHAR(BE.FECCREACION,'MM/YYYY') AS COMPETENCIA_ENTREGA, ")
				.append("  TO_CHAR(B.FECCREACION,'MM/YYYY') AS COMPETENCIA_VENDA, ")
				.append("  SUM(B.PRECIOPAGADO) AS TARIFA, ")
				.append("  SUM(B.IMPORTEPEDAGIO) AS PEDAGIO, ")
				.append("  SUM(B.IMPORTESEGURO) AS SEGURO, ")
				.append("  SUM(B.IMPORTETAXAEMBARQUE) AS TAXA_EMBARQUE, ")
				.append("  COUNT(B.BOLETO_ID) AS QTDE ")
				.append("FROM BOLETO B ")
				.append("  JOIN BOLETO BE ON B.BOLETO_ID = BE.BOLETOORIGINAL_ID ")
				.append("  AND BE.FECCREACION BETWEEN :dataInicial AND :dataFinal ")
				.append("WHERE B.TIPOVENTA_ID IN (5,12,18) ")
				.append("  AND B.EMPRESACORRIDA_ID = :empresaId ")
				.append("  AND B.INDSTATUSBOLETO = 'V' ")
				.append("AND B.MOTIVOCANCELACION_ID = 16 ")
				.append("  AND B.FECCREACION < :dataInicial ")
				.append("  AND BE.INDSTATUSBOLETO = 'E' ")
				.append("GROUP BY 'VENDIDO EM COMPETÊNCIA ANTERIOR', ")
				.append("  TO_CHAR(B.FECCREACION,'MM/YYYY'), ")
				.append("  TO_CHAR(BE.FECCREACION,'MM/YYYY') ");

		sQuery.append("UNION ");

		/* VENDIDO E NÃO ENTREGUE NA COMPETENCIA */
		sQuery.append("SELECT 'VENDIDO E NÃO ENTREGUE NA COMPETÊNCIA' AS SITUACAO, ")
				.append("'' AS COMPETENCIA_ENTREGA, ")
				.append("TO_CHAR(B.FECCREACION,'MM/YYYY') AS COMPETENCIA_VENDA, ")
				.append("SUM(B.PRECIOPAGADO) AS TARIFA, ")
				.append("SUM(B.IMPORTEPEDAGIO) AS PEDAGIO, ")
				.append("SUM(B.IMPORTESEGURO) AS SEGURO, ")
				.append("SUM(B.IMPORTETAXAEMBARQUE) AS TAXA_EMBARQUE, ")
				.append("COUNT(B.BOLETO_ID) AS QTDE ")
				.append("FROM BOLETO B ")
				.append("LEFT JOIN BOLETO BE ON B.BOLETO_ID = BE.BOLETOORIGINAL_ID ")
				.append("WHERE B.TIPOVENTA_ID IN (5,12,18) ")
				.append("AND B.FECCREACION BETWEEN :dataInicial AND :dataFinal ")
				.append("AND B.EMPRESACORRIDA_ID = :empresaId ")
				.append("AND B.INDSTATUSBOLETO = 'V' ")
				.append("AND (BE.BOLETO_ID IS NULL ")
				.append("    OR (BE.INDSTATUSBOLETO = 'E' ")
				.append("	 AND B.MOTIVOCANCELACION_ID = 16 ")
				.append("    AND BE.FECCREACION > :dataFinal )) ")
				.append("GROUP BY 'VENDIDO E NÃO ENTREGUE NA COMPETÊNCIA', ")
				.append("			TO_CHAR(B.FECCREACION,'MM/YYYY') ");

		sQuery.append("ORDER BY SITUACAO, COMPETENCIA_ENTREGA, COMPETENCIA_VENDA");

		return sQuery.toString();
	}

	@Override
	protected void processaParametros() throws Exception {
	}

}
