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.Aidf;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.impressaormd.vo.FolioRMD;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

public class RelatorioFolioRmd extends Relatorio {

	private static Logger log = LogManager.getLogger(RelatorioFolioRmd.class);
	List<FolioRMD> listdata = null;
	private static final String DATE_FORMAT_FISCAL = "yyyyMMdd";

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

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

				try {
					Empresa empresa = (Empresa) parametros.get("empresa");
					Estado estado = (Estado) parametros.get("estado");
					Aidf aidf = (Aidf) parametros.get("aidf");
					Date dataInicial = (Date) parametros.get("dataInicial");
					Date dataFinal = (Date) parametros.get("dataFinal");

					NamedParameterStatement stmt = new NamedParameterStatement(getConexao(), getSqlRMDReporte());
					stmt.setInt("empresaId", empresa.getEmpresaId());
					stmt.setInt("estadoId", estado.getEstadoId());
					stmt.setLong("rmdId", aidf.getAidfId());
					stmt.setDate("dataInicial", new java.sql.Date(dataInicial.getTime()));
					stmt.setDate("dataFinal", new java.sql.Date(dataFinal.getTime()));

					ResultSet rset = stmt.executeQuery();
					listdata = new ArrayList<FolioRMD>();
					while (rset.next()) {
						FolioRMD item = new FolioRMD();

						item.setFoliormd(rset.getString("foliormd"));
						item.setStatus(rset.getString("status"));
						item.setFechorfolio(rset.getString("fechorfolio"));
						item.setEmpresa(rset.getString("empresa"));
						item.setUf(rset.getString("uf"));
						item.setEstado(rset.getString("estado"));
						item.setDoc(rset.getString("doc"));
						item.setTipo(rset.getString("tipo"));
						item.setFechorfolioDate(DateUtil.getDateFromString(item.getFechorfolio(), DATE_FORMAT_FISCAL));
						item.setValorContabil(rset.getBigDecimal("valorContabil"));
						item.setBaseCalculo(rset.getBigDecimal("baseCalculo"));
						item.setAliquota(rset.getBigDecimal("aliquota"));
						item.setIsentos(rset.getBigDecimal("isentos"));
						item.setOutros(rset.getBigDecimal("outros"));
						item.setIcms(rset.getBigDecimal("icms"));

						listdata.add(item);
					}

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

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

		});

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

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSqlRMDReporte() {

		StringBuilder sql = new StringBuilder();
		sql.append("select f.folio as foliormd, ");
		sql.append("   case when f.indcancelacion = 1 then 'CANCELADO' else  'IMPRESSO' end as status, ");
		sql.append("   to_char(f.fechorfolio, 'yyyymmdd') as fechorfolio, ");
		sql.append("   e.nombempresa as empresa, ");
		sql.append("   eo.cveestado as uf, ");
		sql.append("   eo.nombestado as estado, ");
		sql.append("   ai.docfiscal as doc, ");
		sql.append("   case when f.indecf = 1 then 'ECF' else 'BPR' end as tipo, ");
		sql.append("   case when f.indcancelacion = 1 then 0 else f.valorcontabil end as valorContabil, ");
		sql.append("   case when f.indcancelacion = 1 then 0 else f.basecalculo end as baseCalculo, ");
		sql.append("   case when f.indcancelacion = 1 then 0 else f.aliquota end as aliquota, ");
		sql.append("   case when f.indcancelacion = 1 then 0 else f.isentos end as isentos, ");
		sql.append("   case when f.indcancelacion = 1 then 0 else f.outros end as outros, ");
		sql.append("   case when f.indcancelacion = 1 then 0 else f.icms end as icms ");
		sql.append("from folio_consumo_rmd f ");
		sql.append("   inner join aidf ai on f.rmd_id = ai.aidf_id and ai.aidfesp_id = 3 ");
		sql.append("   inner join empresa e on e.empresa_id = f.empresa_id ");
		sql.append("   join estado eo on eo.estado_id = f.estado_id ");
		sql.append("where f.empresa_id = :empresaId and f.rmd_id = :rmdId and f.estado_id = :estadoId ");
		sql.append("   and f.fechorfolio between :dataInicial and :dataFinal ");
		sql.append("   and f.indinactivo <> 1 and f.activo = 1 ");
		sql.append("order by tipo, estado, to_number(foliormd) ");

		return sql.toString();
	}
}
