package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
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;

public class RelatorioVendaBilhetePorEmpresaAutorizadora extends Relatorio {

	public RelatorioVendaBilhetePorEmpresaAutorizadora(Map<String, Object> parametros, Connection conexao)
			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();
				NamedParameterStatement stmt = getSql(conexao, parametros, sql);
				setarParmetrosObrigatorios(parametros, stmt);
				ResultSet rset = stmt.executeQuery();
				rset.setFetchSize(1000);
				getResultSet(rset);

				this.resultSet = rset;
			}

			private void getResultSet(ResultSet rset) throws SQLException {
				while (rset.next()) {

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

					carregarDataResult(rset, dataResult);
					this.dados.add(dataResult);

				}
			}

			private void carregarDataResult(ResultSet rset, Map<String, Object> dataResult) throws SQLException {
				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"));
			}

			private void setarParmetrosObrigatorios(Map<String, Object> parametros, NamedParameterStatement stmt)
					throws SQLException {
				
				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()));
			}

			private NamedParameterStatement getSql(Connection conexao, Map<String, Object> parametros,
					StringBuilder sql) throws SQLException {
				sql.append("select ");
				sql.append("    pv.NUMPUNTOVENTA, us.cveusuario , tpv.DESCTIPO, ");
				sql.append("  us.NOMBUSUARIO,  ");
				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 ");
				sql.append("        (");
				sql.append(" coalesce(ca.preciopagado,0) ");
				sql.append("        + coalesce(ca.importepedagio,0) ");
				sql.append(" + coalesce(ca.importetaxaembarque,0) ");
				sql.append(" + coalesce(ca.importeseguro,0) ");
				sql.append("  ) else 0 end ) vlrVendas, ");
				sql.append("        (");
				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 (");
				sql.append(" coalesce(ca.preciopagado,0) ");
				sql.append("        + coalesce(ca.importepedagio,0) ");
				sql.append(" + coalesce(ca.importetaxaembarque,0) ");
				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("    INNER JOIN ruta_empresa re on re.ruta_id=ca.ruta_id and re.activo = 1 ");
				sql.append(" 	join MARCA m on m.marca_id = ca.marca_id ");
				sql.append("where ");
				sql.append(" ca.activo = 1  ");
				sql.append(" and ca.indreimpresion = 0 ");
				sql.append(" and CA.FECHORVENTA >= :DATA_INICIAL  AND CA.FECHORVENTA <= :DATA_FINAL ");
				sql.append(" and re.empresa_autorizadora_id  in ( ");
				sql.append(parametros.get("EMPRESAAUTORIZADORA_ID"));
				sql.append(" ) ");
				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")) {
					sql.append(" and ca.puntoventa_id IN (" + parametros.get("NUMPUNTOVENTA").toString() + ")");
				}
				if (parametros.get("USUARIOIDS") != null && !parametros.get("USUARIOIDS").toString().contains("-1")) {
					sql.append(" and ca.usuario_id IN (" + parametros.get("USUARIOIDS").toString() + ")");
				}
				sql.append(" group by pv.NUMPUNTOVENTA, us.cveusuario, tpv.DESCTIPO, ");
				sql.append("  us.NOMBUSUARIO  ");
				sql.append(" order by pv.NUMPUNTOVENTA,  ");
				sql.append("  us.NOMBUSUARIO  ");
				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql.toString());
				stmt.setInt("EMPRESAAUTORIZADORA_ID",
						Integer.valueOf(parametros.get("EMPRESAAUTORIZADORA_ID").toString()));
				
				return stmt;
			}
		});
	}

	@Override
	protected void processaParametros() throws Exception {
		// TODO Auto-generated method stub

	}
}
