package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
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.ItemRelatorioFinanceiro;

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

public class RelatorioAnaliticoFinanceiro extends Relatorio {

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

	List<ItemRelatorioFinanceiro> listdata = null;

	public RelatorioAnaliticoFinanceiro(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<ItemRelatorioFinanceiro> buscarMovimentosAnaliticos(Date inicio, Date fim, Integer empresaId) throws SQLException {

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

		StringBuilder sql = new StringBuilder();
		sql.append("select ");
		sql.append("'FINANCEIRA' as movimentacao, ");
		sql.append("caja.descripcionEmpresa as empresa, ");
		sql.append("sum(caja.importe + caja.importeCancelacion) as valorEnCaja, ");
		sql.append("case when caja.indstatusboleto = 'E' or caja.tipoVentaId IN (5,12,18) THEN 'VOUCHER' ");
		sql.append("  when caja.tipoVentaId = 3 THEN 'MANUAL' ");
		sql.append("  when caja.indstatusboleto = 'V' THEN 'NORMAL' ");
		sql.append("  when caja.indstatusboleto = 'C' THEN 'CANCELAMENTO' ");
		sql.append("  when caja.indstatusboleto = 'T' THEN 'TROCA' ");
		sql.append("  ELSE 'OUTRO' END tipoVenta ");
		sql.append("from ");
		sql.append("( ");
		sql.append("select ");
		sql.append("    e.NOMBEMPRESA as descripcionEmpresa, ");
		sql.append("    c.FECHORVENTA as fechorVenta, ");
		sql.append("    case when c.MOTIVOCANCELACION_ID is null  then cfp.IMPORTE else 0 end as importe, ");
		sql.append("    case when c.MOTIVOCANCELACION_ID is null then 0 else  cfp.IMPORTE * -1 end as importeCancelacion, ");
		sql.append("    c.INDREIMPRESION as indReimpresion, ");
		sql.append("    c.TIPOVENTA_ID as tipoVentaId, ");
		sql.append("    c.indstatusboleto as indstatusboleto ");
		sql.append("from ");
		sql.append("    CAJA c ");
		sql.append("inner join CAJA_FORMAPAGO cfp on c.CAJA_ID=cfp.CAJA_ID and cfp.activo = 1 ");
		sql.append("inner join FORMA_PAGO fp on cfp.FORMAPAGO_ID=fp.FORMAPAGO_ID ");
		sql.append("INNER join EMPRESA e on c.MARCA_ID = e.EMPRESA_ID ");
		sql.append(" ");
		sql.append("where c.FECHORVENTA BETWEEN ? AND ? ");
		sql.append("    and c.TIPOVENTA_ID<> 6 ");
		sql.append("    and e.EMPRESA_ID= ? ");
		sql.append("    ) caja ");
		sql.append("where caja.indReimpresion = 0 ");
		sql.append("group by caja.descripcionEmpresa, ");
		sql.append("case when caja.indstatusboleto = 'E' or caja.tipoVentaId IN (5,12,18) THEN 'VOUCHER' ");
		sql.append("  when caja.tipoVentaId = 3 THEN 'MANUAL' ");
		sql.append("  when caja.indstatusboleto = 'V' THEN 'NORMAL' ");
		sql.append("  when caja.indstatusboleto = 'C' THEN 'CANCELAMENTO' ");
		sql.append("  when caja.indstatusboleto = 'T' THEN 'TROCA' ");
		sql.append("  ELSE 'OUTRO' END ");
		sql.append("   ");
		sql.append("  UNION ");
		sql.append("   ");
		sql.append("select ");
		sql.append("'FISCAL' as movimentacao, ");
		sql.append("caja.descripcionEmpresa as empresa, ");
		sql.append("sum(caja.importe + caja.importeCancelacion) as valorEnCaja, ");
		sql.append("case when caja.indstatusboleto = 'E' or caja.tipoVentaId IN (5,12,18) THEN 'IMPRESSÃO VOUCHER' ");
		sql.append("  when caja.tipoVentaId = 3 THEN 'MANUAL' ");
		sql.append("  when caja.indstatusboleto = 'V' THEN 'NORMAL' ");
		sql.append("  when caja.indstatusboleto = 'C' THEN 'CANCELAMENTO' ");
		sql.append("  when caja.indstatusboleto = 'T' THEN 'TROCA' ");
		sql.append("  ELSE 'OUTRO' END TIPO_VENDA ");
		sql.append("from ");
		sql.append("( ");
		sql.append("select ");
		sql.append("    e.NOMBEMPRESA as descripcionEmpresa, ");
		sql.append("    c.FECHORVENTA as fechorVenta, ");
		sql.append("    case when c.MOTIVOCANCELACION_ID is null  then cfp.IMPORTE else 0 end as importe, ");
		sql.append("    case when c.MOTIVOCANCELACION_ID is null then 0 else  cfp.IMPORTE * -1 end as importeCancelacion, ");
		sql.append("    c.INDREIMPRESION as indReimpresion, ");
		sql.append("    c.TIPOVENTA_ID as tipoVentaId, ");
		sql.append("    c.indstatusboleto as indstatusboleto ");
		sql.append("from ");
		sql.append("    CAJA c ");
		sql.append("inner join CAJA_FORMAPAGO cfp on c.CAJA_ID=cfp.CAJA_ID and cfp.activo = 1 ");
		sql.append("inner join FORMA_PAGO fp on cfp.FORMAPAGO_ID=fp.FORMAPAGO_ID ");
		sql.append("INNER join EMPRESA e on c.MARCA_ID = e.EMPRESA_ID ");
		sql.append("inner join FISCAL_R4 FR4 ON FR4.CAJA_ID = c.CAJA_ID ");
		sql.append(" ");
		sql.append("where c.FECHORVENTA BETWEEN ? AND ? ");
		sql.append("    and c.TIPOVENTA_ID<>6 ");
		sql.append("    and e.EMPRESA_ID= ? ");
		sql.append("    ) caja ");
		sql.append("group by caja.descripcionEmpresa, ");
		sql.append("case when caja.indstatusboleto = 'E' or caja.tipoVentaId IN (5,12,18) THEN 'IMPRESSÃO VOUCHER' ");
		sql.append("  when caja.tipoVentaId = 3 THEN 'MANUAL' ");
		sql.append("  when caja.indstatusboleto = 'V' THEN 'NORMAL' ");
		sql.append("  when caja.indstatusboleto = 'C' THEN 'CANCELAMENTO' ");
		sql.append("  when caja.indstatusboleto = 'T' THEN 'TROCA' ");
		sql.append("  ELSE 'OUTRO' END ");
		sql.append("  order by movimentacao, tipoVenta ");

		PreparedStatement stmt = getConexao().prepareStatement(sql.toString());
		stmt.setTimestamp(1, new java.sql.Timestamp(inicio.getTime()));
		stmt.setTimestamp(2, new java.sql.Timestamp(fim.getTime()));
		stmt.setInt(3, empresaId);
		stmt.setTimestamp(4, new java.sql.Timestamp(inicio.getTime()));
		stmt.setTimestamp(5, new java.sql.Timestamp(fim.getTime()));
		stmt.setInt(6, empresaId);

		ResultSet rset = stmt.executeQuery();
		List<ItemRelatorioFinanceiro> list = new ArrayList<ItemRelatorioFinanceiro>();
		while (rset.next()) {
			ItemRelatorioFinanceiro item = new ItemRelatorioFinanceiro();
			item.setEmpresa(rset.getString("empresa"));
			item.setMovimentacao(rset.getString("movimentacao"));
			item.setTipoVenta(rset.getString("tipoVenta"));
			item.setValorEnCaja(rset.getBigDecimal("valorEnCaja"));

			list.add(item);
		}

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

		return list;
	}

	@Override
	protected void processaParametros() throws Exception {
	}

}
