/**
 * 
 */
package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.ArrayDataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

/**
 * @author Bruno Neves
 *
 */
public class RelatorioVendasBilheteiroSintetico extends Relatorio {

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

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

				Connection conexao = this.relatorio.getConexao();
				Map<String, Object> parametros = this.relatorio.getParametros();
				StringBuilder sql = new StringBuilder();
				
				Boolean isDigitacao = parametros.get("ORGANIZADODIGITACAO")==null? false: (Boolean)parametros.get("ORGANIZADODIGITACAO");
				Boolean isFechamento = parametros.get("ORGANIZADOFECHAMENTO")==null? false: (Boolean)parametros.get("ORGANIZADOFECHAMENTO");

				sql.append("select ");
				sql.append("    pv.NUMPUNTOVENTA, us.cveusuario , tpv.DESCTIPO, ");
				
				if(isDigitacao) {
					sql.append("  CONCAT(CONCAT(est.NUMCAJA, ' - '),  est.DESCESTACION)  as NOMBUSUARIO, ");
				} else {
					sql.append("  us.NOMBUSUARIO,  ");
				}
				
				if(isFechamento) {
					sql.append("    uc.CVEUSUARIO as USUARIOFEC, pvc.NUMPUNTOVENTA as NUMPUNTOVENTAFEC, ");
				}
				
				sql.append("    sum (case when ca.motivocancelacion_id is null then 1 else 0 end) qtdVendas, ");
				sql.append("    sum (case when ca.motivocancelacion_id is null then ");
				
			
				Boolean soma = false;
				sql.append("        (");
				if (parametros.get("TARIFA") != null) {
					soma = true;
					sql.append(" coalesce(ca.preciopagado,0) ");
				}
				if (parametros.get("PEDAGIO") != null) {
					if (soma) {
						sql.append("        + coalesce(ca.importepedagio,0) ");
					} else {
						sql.append("  coalesce(ca.importepedagio,0) ");
						soma = true;
					}
				}
				if (parametros.get("TAXADEEMBARQUE") != null) {						
					if (soma) {						
						sql.append(" + coalesce(ca.importetaxaembarque,0) ");
					} else {
						sql.append(" coalesce(ca.importetaxaembarque,0) ");
						soma = true;
					}
				}
				if (parametros.get("SEGURO") != null) {
					if (soma) {
						sql.append(" + coalesce(ca.importeseguro,0) ");
					} else {
						sql.append("  coalesce(ca.importeseguro,0) ");
					}						
				}
				sql.append("  ) else 0 end ) vlrVendas, ");
				
				sql.append("    sum (case when ca.motivocancelacion_id is not null then 1 else 0 end) qtdCancelados, ");
				sql.append("    sum (case when ca.motivocancelacion_id is not null then ");
				
				soma = false;
				sql.append("        (");
				if (parametros.get("TARIFA") != null) {						
					sql.append(" coalesce(ca.preciopagado,0) ");
					soma = true;
				}
				if (parametros.get("PEDAGIO") != null) {					
					if (soma) {
						sql.append("        + coalesce(ca.importepedagio,0) ");
					} else {							
						sql.append("  coalesce(ca.importepedagio,0) ");
						soma = true;
					}
				}
				if (parametros.get("TAXADEEMBARQUE") != null) {						
					if (soma) {
						sql.append(" + coalesce(ca.importetaxaembarque,0) ");
					} else {
						sql.append(" coalesce(ca.importetaxaembarque,0) ");
						soma = true;
					}
				}
				if (parametros.get("SEGURO") != null) {
					if (soma) {
						sql.append(" + coalesce(ca.importeseguro,0) ");
					} else {
						sql.append("  coalesce(ca.importeseguro,0) ");
					}						
				}
				sql.append("  ) else 0 end ) vlrCancelados ");

				
				sql.append("from ");
				sql.append("    caja ca ");
				sql.append("    inner join usuario us on us.usuario_id = ca.usuario_id ");
				sql.append("    inner join punto_venta pv on pv.puntoventa_id = ca.puntoventa_id ");
				sql.append("    INNER JOIN  TIPO_PTOVTA tpv ON tpv.TIPOPTOVTA_ID = pv.TIPOPTOVTA_ID ");
				sql.append(" 	join MARCA m on m.marca_id = ca.marca_id ");
				
				if (isDigitacao) {	
					sql.append(" 	JOIN DIGITA_ITEM_BOLETO dib on (ca.TRANSACAO_ID = dib.BOLETO_ID) ");
					sql.append(" 	LEFT JOIN DIGITA_VENTA dv on (dib.DIGITAVENTA_ID = dv.DIGITAVENTA_ID) ");
					sql.append(" 	LEFT JOIN USUARIO_UBICACION udu on (udu.USUARIO_ID = dv.USUARIO_ID and udu.ACTIVO = 1 and udu.PADRAO = 1) ");
					sql.append("    LEFT JOIN ESTACION est on ( est.estacion_id = ca.estacion_id AND est.ACTIVO = 1 ) ");
				}
				
				if(isFechamento) {
					sql.append(" 	INNER JOIN CORTE_TURNO ct ");
					sql.append(" 	ON ca.FECCORTE = ct.FECCORTE ");
					sql.append(" 	AND ca.USUARIO_ID = ct.ASESOR_ID ");
					sql.append(" 	AND ca.PUNTOVENTA_ID = ct.PUNTOVENTA_ID ");
					sql.append(" 	AND ca.TURNO_ID = ct.TURNO_ID ");
					sql.append(" 	AND ca.ACTIVO = 1 ");
					sql.append(" 	LEFT JOIN USUARIO_UBICACION uu on uu.USUARIO_ID = ct.USUARIO_ID and uu.ACTIVO = 1 and udu.PADRAO = 1");
					sql.append(" 	INNER JOIN usuario uc ON uc.usuario_id = ct.usuario_id ");
					sql.append(" 	INNER JOIN punto_venta pvc ON pvc.puntoventa_id = uu.puntoventa_id ");
				}
				
				sql.append("where ");
				sql.append(" ca.activo = 1  ");
				sql.append(" and ca.indreimpresion = 0 ");
				if (buscarPorDataDaVenda) {
					sql.append(" and CA.FECHORVENTA >= :DATA_INICIAL  AND CA.FECHORVENTA <= :DATA_FINAL ");
				}else {
					sql.append(" and ca.FECCORTE  >= :DATA_INICIAL and ca.FECCORTE  <= :DATA_FINAL");
				}
					
				if (parametros.get("EMPRESA_ID") != null) {
					sql.append(" and m.EMPRESA_ID = :EMPRESA_ID");
				}

				if (parametros.get("NUMPUNTOVENTA") != null && !parametros.get("NUMPUNTOVENTA").toString().contains("-1")) {
					if (isDigitacao) {
						sql.append(" and udu.puntoventa_id IN (" + parametros.get("NUMPUNTOVENTA").toString() + ")");
					}else if (isFechamento) {
						sql.append(" and uu.puntoventa_id IN (" + parametros.get("NUMPUNTOVENTA").toString() + ")");
					}else {
						sql.append(" and ca.puntoventa_id IN (" + parametros.get("NUMPUNTOVENTA").toString() + ")");
					}
				}
				
				if (parametros.get("USUARIOIDS") != null && !parametros.get("USUARIOIDS").toString().contains("-1")) {
					
					if (isFechamento) {
						sql.append(" and ct.usuario_id IN (" + parametros.get("USUARIOIDS").toString() + ")");
					}else {
						sql.append(" and ca.usuario_id IN (" + parametros.get("USUARIOIDS").toString() + ")");
					}
				}
				
				if (parametros.get("TIPOPUNTOVENTA_ID") != null && !parametros.get("TIPOPUNTOVENTA_ID").toString().equals("-1")) {
					sql.append(" and pv.TIPOPTOVTA_ID  = :TIPOPUNTOVENTA_ID ");
				}
				sql.append(" group by pv.NUMPUNTOVENTA, us.cveusuario, tpv.DESCTIPO, ");
				
				if(isDigitacao) {
					sql.append("  CONCAT(CONCAT(est.NUMCAJA, ' - '),  est.DESCESTACION) ");
				} else {
					sql.append("  us.NOMBUSUARIO  ");
				}
				
				if(isFechamento) {
					sql.append(" , uc.CVEUSUARIO, pvc.NUMPUNTOVENTA ");
				}
				sql.append(" order by pv.NUMPUNTOVENTA,  ");
				
				if(isDigitacao) {
					sql.append("  CONCAT(CONCAT(est.NUMCAJA, ' - '),  est.DESCESTACION) ");
				} else {
					sql.append("  us.NOMBUSUARIO  ");
				}
				
				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql.toString());
				if (parametros.get("EMPRESA_ID") != null) {
					stmt.setInt("EMPRESA_ID", Integer.valueOf(parametros.get("EMPRESA_ID").toString()));
				}
				java.sql.Date d = new java.sql.Date(((Date) parametros.get("DATA_INICIAL")).getTime());
				
				stmt.setDate("DATA_INICIAL", d);
				stmt.setTimestamp("DATA_FINAL", new Timestamp(DateUtil.fimFecha((Date) parametros.get("DATA_FINAL")).getTime()));
				if (parametros.get("TIPOPUNTOVENTA_ID") != null && !parametros.get("TIPOPUNTOVENTA_ID").toString().equals("-1")) {
					stmt.setInt("TIPOPUNTOVENTA_ID", Integer.valueOf(parametros.get("TIPOPUNTOVENTA_ID").toString()));
				}
				
				ResultSet rset = stmt.executeQuery();

				rset.setFetchSize(1000);
				while (rset.next()) {

					Map<String, Object> dataResult = new HashMap<String, Object>();

					dataResult.put("NUMPUNTOVENTA", rset.getString("NUMPUNTOVENTA"));
					dataResult.put("CVEUSUARIO", rset.getString("CVEUSUARIO"));
					dataResult.put("NOMBUSUARIO", rset.getString("NOMBUSUARIO"));
					dataResult.put("QTDVENDAS", rset.getInt("QTDVENDAS"));
					dataResult.put("VLRVENDAS", rset.getBigDecimal("VLRVENDAS"));
					dataResult.put("QTDCANCELADOS", rset.getInt("QTDCANCELADOS"));
					dataResult.put("VLRCANCELADOS", rset.getBigDecimal("VLRCANCELADOS"));
					dataResult.put("DESCTIPO", rset.getString("DESCTIPO"));
					
					if(isFechamento) {
						dataResult.put("USUARIOFEC", rset.getString("USUARIOFEC"));
						dataResult.put("NUMPUNTOVENTAFEC", rset.getString("NUMPUNTOVENTAFEC"));
					}
					
					this.dados.add(dataResult);

				}

				this.resultSet = rset;
			}
		});
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio#processaParametros()
	 */
	@Override
	protected void processaParametros() throws Exception {

	}

}
