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

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

public class RelatorioMovimentacaoEstoque extends Relatorio {
	
	private static Logger log = LogManager.getLogger(RelatorioMovimentacaoEstoque.class);

	List<ItemRelatorioMovimentoEstoque> list = null;

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

		this.setCustomDataSource(new DataSource(this) {

			public void initDados() throws Exception {
				Connection conexao = this.relatorio.getConexao();
				Map<String, Object> parametros = this.relatorio.getParametros();
				list = getMovimentoEstoque(parametros, conexao);
			}
		});
		
		this.setCollectionDataSource(new JRBeanCollectionDataSource(list));
	}
	
	public List<ItemRelatorioMovimentoEstoque> getMovimentoEstoque(Map<String, Object> parametros, Connection conexao) throws SQLException {

		String sql = getSql();
		NamedParameterStatement stmt = null;
		ResultSet rset = null;
		List<ItemRelatorioMovimentoEstoque> retorno = null;
		
		try {
			stmt = new NamedParameterStatement(conexao, sql);
			if(parametros.get("empresaId") != null){
				stmt.setInt("empresaId", Integer.valueOf(parametros.get("empresaId").toString()));
			}
			
			if(parametros.get("puntoventaIdEnv") != null){
				stmt.setInt("puntoventaIdEnv", Integer.valueOf(parametros.get("puntoventaIdEnv").toString()));
			}
			
			if(parametros.get("puntoventaIdRec") != null){
				stmt.setInt("puntoventaIdRec", Integer.valueOf(parametros.get("puntoventaIdRec").toString()));
			}
			
			if(parametros.get("estacionIdEnv") != null){
				stmt.setInt("estacionIdEnv", Integer.valueOf(parametros.get("estacionIdEnv").toString()));
			}
			
			if(parametros.get("estacionIdRec") != null){
				stmt.setInt("estacionIdRec", Integer.valueOf(parametros.get("estacionIdRec").toString()));
			}
			
			if(parametros.get("dataInicial") != null){
				stmt.setString("dataInicial", parametros.get("dataInicial") + " 00:00");
			}
			
			if(parametros.get("dataFinal") != null){
				stmt.setString("dataFinal", parametros.get("dataFinal") + " 23:59");
			}

			rset = stmt.executeQuery();

			retorno = new ArrayList<ItemRelatorioMovimentoEstoque>();
			while (rset.next()) {
				ItemRelatorioMovimentoEstoque item = new ItemRelatorioMovimentoEstoque();
				item.setAidf(rset.getString("AIDF"));
				item.setSerie(rset.getString("SERIE"));
				item.setSubserie(rset.getString("SUBSERIE"));
				item.setData(rset.getDate("DATA"));
				item.setEmpresa(rset.getString("NOMBEMPRESA"));
				item.setEstacionEnv(rset.getString("ESTACION_ENV"));
				item.setEstacionRec(rset.getString("ESTACION_REC"));
				item.setNumFolioInicial(rset.getString("NUMFOLIOINICIAL"));
				item.setNumFolioFinal(rset.getString("NUMFOLIOFINAL"));
				item.setTotal(rset.getInt("TOTAL"));
				item.setPuntoventaEnv(rset.getString("NOMBPUNTOVENTA_ENV"));
				item.setPuntoventaRec(rset.getString("NOMBPUNTOVENTA_REC"));
				item.setUsuario(rset.getString("USUARIO"));
				
				retorno.add(item);
			}
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		} finally {
			if(rset != null && !rset.isClosed()) {
				rset.close();
			}
			if(stmt != null && !stmt.isClosed()) {
				stmt.close();
			}
		}
		
		return retorno;
	}

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSql() {
		StringBuilder sQuery = new StringBuilder();
		sQuery.append("SELECT E.NOMBEMPRESA, DETH.FECMODIF AS DATA, AI.AIDF_ID AS AIDF, AI.SERIE, AI.SUBSERIE, DETREC.NUMFOLIOINICIAL, DETREC.NUMFOLIOFINAL, ")
			  .append("(TO_NUMBER(DETREC .NUMFOLIOFINAL) - TO_NUMBER(DETREC.NUMFOLIOINICIAL) + 1) AS TOTAL, ")
			  .append("PVENV.NOMBPUNTOVENTA AS NOMBPUNTOVENTA_ENV, EENV.DESCESTACION AS ESTACION_ENV, PVREC.NOMBPUNTOVENTA AS NOMBPUNTOVENTA_REC, EREC.DESCESTACION AS ESTACION_REC, ")
			  .append("DETH.FECMODIF AS DATA, U.USUARIO_ID || ' - ' || U.CVEUSUARIO AS USUARIO ")
			  .append("FROM DET_ABASTO_BOLETO DET ")
			  .append("JOIN AIDF AI ON AI.AIDF_ID = DET.AIDF_ID ")
			  .append("JOIN ABASTO_BOLETO AB ON AB.ABASTOBOLETO_ID = DET.ABASTOBOLETO_ID ")
			  .append("JOIN EMPRESA E ON E.EMPRESA_ID = AB.EMPRESA_ID ")
			  .append("JOIN DET_ABASTO_BOLETO_HIST DETH ON DET.DETABASTOBOLETO_ID = DETH.DETABASTOBOLETOENV_ID ")
			  .append("LEFT JOIN DET_ABASTO_BOLETO DETREC ON DETREC.DETABASTOBOLETO_ID = DETH.DETABASTOBOLETOREC_ID ")
			  .append("LEFT JOIN ABASTO_BOLETO ABREC ON ABREC.ABASTOBOLETO_ID = DETREC.ABASTOBOLETO_ID ")
			  .append("LEFT JOIN ESTACION EENV ON EENV.ESTACION_ID = AB.ESTACION_ID ")
			  .append("LEFT JOIN ESTACION EREC ON EREC.ESTACION_ID = ABREC.ESTACION_ID ")
			  .append("LEFT JOIN PUNTO_VENTA PVENV ON PVENV.PUNTOVENTA_ID = AB.PUNTOVENTA_ID ")
			  .append("LEFT JOIN PUNTO_VENTA PVREC ON PVREC.PUNTOVENTA_ID = ABREC.PUNTOVENTA_ID ")
			  .append("LEFT JOIN USUARIO U ON U.USUARIO_ID = DETH.USUARIO_ID ")
			  .append("WHERE DET.ACTIVO = 1 ");
		
		if(parametros.get("empresaId") != null){
			sQuery.append("AND E.EMPRESA_ID = :empresaId ");
		}
		
		if(parametros.get("puntoventaIdEnv") != null){
			sQuery.append("AND PVENV.PUNTOVENTA_ID = :puntoventaIdEnv ");
		}
		
		if(parametros.get("puntoventaIdRec") != null){
			sQuery.append("AND PVREC.PUNTOVENTA_ID = :puntoventaIdRec ");
		}
		
		if(parametros.get("estacionIdEnv") != null){
			sQuery.append(" AND EENV.ESTACION_ID = :estacionIdEnv ");
		}
		
		if(parametros.get("estacionIdRec") != null){
			sQuery.append("AND EREC.ESTACION_ID = :estacionIdRec ");
		}
		
		if(parametros.get("dataInicial") != null){
			sQuery.append("AND DETH.FECMODIF >= TO_DATE(:dataInicial, 'DD/MM/YYYY HH24:MI') ");
		}
		
		if(parametros.get("dataFinal") != null){
			sQuery.append("AND DETH.FECMODIF <= TO_DATE(:dataFinal, 'DD/MM/YYYY HH24:MI') ");
		}
		
		sQuery.append("ORDER BY DETH.FECMODIF, E.NOMBEMPRESA");
		
		return sQuery.toString();
	}

}
