package com.rjconsultores.ventaboletos.relatorios.impl;

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

import com.rjconsultores.ventaboletos.relatorios.utilitarios.ConferenciaFormularioFisico;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;

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

public class RelatorioConferenciaFormularioFisico extends Relatorio {

	public RelatorioConferenciaFormularioFisico(Map<String, Object> parametros, Connection conexao) {
		super(parametros, conexao);

	}

	public void setLsDadosRelatorio(List<ConferenciaFormularioFisico> formularios) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(formularios));
	}

	private String getSql(Integer puntoventaId, Integer tipoventaId) {

		StringBuffer sql = new StringBuffer();
		sql.append("select t1.ter,t1.caixa,t1.serie,t1.feccorte,t1.usuario,t1.turno,t1.abertura,t1.fechamento, ");
		sql.append("t1.minfisico,t1.maxfisico,t1.dif1,t1.total, ");
		sql.append("min(to_number(nvl(t2.numfoliosistema,0))) as minlogico, max(to_number(nvl(t3.numfoliosistema,0))) as maxlogico ");
		sql.append("from  ");
		sql.append("(select  ");
		sql.append("  e.numcaja as ter,  ");
		sql.append("  p.nombpuntoventa as caixa,  ");
		sql.append("  c.numseriepreimpresa as serie,   ");
		sql.append("  c.feccorte as feccorte,   ");
		sql.append("  u.cveusuario || ' - ' || u.nombusuario as usuario,  ");
		sql.append("  t.turno_id as turno,  ");
		sql.append("  min(c.fechorventa) as abertura,  ");
		sql.append("  max(c.fechorventa) as fechamento,  ");
		sql.append("  min(to_number(c.numfoliopreimpreso)) as minfisico,  ");
		sql.append("  max(to_number(c.numfoliopreimpreso)) as maxfisico,  ");
		sql.append("  (max(to_number(c.numfoliopreimpreso)) + 1) - min(to_number(c.numfoliopreimpreso)) as dif1, ");
		sql.append("  count(case when (c.indreimpresion = 1 and c.indstatusboleto = 'E') then -1 else 1 end) as total ");
		sql.append("from   ");
		sql.append("  caja c  ");
		sql.append("  inner join estacion e on e.estacion_id = c.estacion_id  ");
		sql.append("  inner join punto_venta p on p.puntoventa_id = c.puntoventa_id  ");
		sql.append("    and p.puntoventa_id = e.puntoventa_id  ");
		sql.append("  inner join usuario u on u.usuario_id = c.usuario_id  ");
		sql.append("  inner join turno t on t.turno_id = c.turno_id  ");
		sql.append("	where ");
		sql.append("  		c.empresacorrida_id = ? ");
		sql.append("  		and c.feccorte between to_date(?,'dd/mm/yyyy hh24:mi') and to_date(?,'dd/mm/yyyy hh24:mi') ");
		if (puntoventaId != null && puntoventaId != -1) {
			sql.append("  	and c.puntoventa_id = " + puntoventaId);
		}
		sql.append("  and c.activo <> 0 ");
		sql.append("  and c.motivocancelacion_id is null ");
		sql.append("  and c.numfoliopreimpreso is not null ");
		sql.append("  and c.numfoliosistema is not null ");
		sql.append("  and ((c.indstatusboleto = 'E' and c.indreimpresion = 1) or c.indreimpresion = 0) ");
		sql.append("group by   ");
		sql.append("  e.numcaja,   ");
		sql.append("  p.nombpuntoventa,   ");
		sql.append("  c.numseriepreimpresa,   ");
		sql.append("  c.feccorte,   ");
		sql.append("  u.cveusuario || ' - ' || u.nombusuario,   ");
		sql.append("  t.turno_id  ");
		sql.append("having min(to_number(c.numfoliopreimpreso)) > 0 ");
		sql.append("order by   ");
		sql.append("  u.nombusuario, min(c.fechorventa)) t1 ");
		sql.append("inner join (select numfoliosistema, numfoliopreimpreso, numseriepreimpresa, feccorte from caja where ((indstatusboleto = 'E' and indreimpresion = 1) or indreimpresion = 0)) t2 on t1.minfisico = t2.numfoliopreimpreso and t1.serie = t2.numseriepreimpresa and t1.feccorte = t2.feccorte ");
		sql.append("inner join (select numfoliosistema, numfoliopreimpreso, numseriepreimpresa, feccorte from caja where ((indstatusboleto = 'E' and indreimpresion = 1) or indreimpresion = 0)) t3 on t1.maxfisico = t3.numfoliopreimpreso and t1.serie = t3.numseriepreimpresa and t1.feccorte = t3.feccorte ");
		sql.append("inner join det_abasto_boleto dab on t1.minfisico between dab.numfolioinicial and dab.numfoliofinal and dab.numseriepreimpresa = t1.serie  ");
		sql.append("inner join abasto_boleto abb on abb.abastoboleto_id = dab.abastoboleto_id ");
		if (tipoventaId != null) {
			sql.append("where abb.articulo_id = " + tipoventaId);
		}
		sql.append(" group by t1.ter,t1.caixa,t1.serie,t1.feccorte,t1.usuario,t1.turno,t1.abertura,t1.fechamento, t1.minfisico,t1.maxfisico,t1.dif1,t1.total ");
		sql.append(" order by t1.caixa, min(to_number(nvl(t2.numfoliosistema,0))), max(to_number(nvl(t3.numfoliosistema,0))) ");
		return sql.toString();
	}

	@Override
	protected void processaParametros() throws Exception {
		Integer puntoventaId = (Integer) getParametros().get("PUNTOVENTA_ID");
		Integer tipoventaId = (Integer) getParametros().get("TIPOVENTA_ID");
		Integer empresaId = (Integer) getParametros().get("EMPRESA_ID");
		Date fecInicio = (Date) getParametros().get("DATA_INICIAL");
		Date fecFinal = (Date) getParametros().get("DATA_FINAL");
		fecInicio = DateUtil.inicioFecha(fecInicio);
		fecFinal = DateUtil.fimFecha(fecFinal);

		String sql = getSql(puntoventaId, tipoventaId);

		PreparedStatement pstmt = getConexao().prepareStatement(sql);
		pstmt.setInt(1, empresaId);
		pstmt.setString(2, DateUtil.getStringDate(fecInicio, "dd/MM/yyyy HH:mm"));
		pstmt.setString(3, DateUtil.getStringDate(fecFinal, "dd/MM/yyyy HH:mm"));

		List<ConferenciaFormularioFisico> formularios = new ArrayList<ConferenciaFormularioFisico>();

		ResultSet rs = pstmt.executeQuery();
		while (rs.next()) {
			
			/*
			1- t1.ter,
			2- t1.caixa,
			3- t1.serie,
			4- t1.feccorte,
			5- t1.usuario,
			6- t1.turno,
			7- t1.abertura,
			8- t1.fechamento, ");
			9- t1.minfisico,
			10- t1.maxfisico,
			11- t1.dif1,
			12- t1.total, ");
			13- min(to_number(nvl(t2.numfoliosistema,0))) as minlogico,
			14- max(to_number(nvl(t3.numfoliosistema,0))) as maxlogico
			*/
			ConferenciaFormularioFisico formulario = new ConferenciaFormularioFisico();
			formulario.setTerminal(rs.getInt(1));
			formulario.setCaixa(rs.getString(2));
			formulario.setSerie(rs.getString(3));
			formulario.setUsuario(rs.getString(5));
			formulario.setTurno(rs.getInt(6));
			formulario.setAbertura(rs.getDate(7));
			formulario.setFechamento(rs.getDate(8));
			formulario.setBilheteFisicoAbertura(rs.getInt(9));
			formulario.setBilheteFisicoFechamento(rs.getInt(10));
			formulario.setDif1(rs.getInt(11));
			formulario.setDif2(rs.getInt(11));
			formulario.setTotal(rs.getInt(12));
			formulario.setBilheteLogicoAbertura(rs.getInt(13));
			formulario.setBilheteLogicoFechamento(rs.getInt(14));
			formularios.add(formulario);
		}

		setLsDadosRelatorio(formularios);
	}
}
