package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.util.Date;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
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.web.utilerias.NamedParameterStatement;

public class RelatorioCadastroClientesConsolidado extends Relatorio {

	public RelatorioCadastroClientesConsolidado(Map<String, Object> parametros, Connection conexao) throws Exception {

		super(parametros, conexao);

		this.setCustomDataSource(new ArrayDataSource(this) {

			public void initDados() throws Exception {
				Connection conexao = this.relatorio.getConexao();
				Map<String, Object> parametros = this.relatorio.getParametros();

				String sql = getSql(parametros);

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
				ResultSet rset = stmt.executeQuery();

				while (rset.next()) {
					Map<String, Object> dataResult = new HashMap<String, Object>();

					dataResult.put("empresa", rset.getString("empresa"));
					dataResult.put("codigoPuntoVenta", rset.getString("codigoPuntoVenta"));
					dataResult.put("puntoVenta", rset.getString("puntoVenta"));
					dataResult.put("tipoPuntoVenta", rset.getString("tipoPuntoVenta"));
					dataResult.put("quantidadeCadastrada", rset.getInt("quantidadeCadastrada"));
					this.dados.add(dataResult);
				}

				this.resultSet = rset;
			}
		});
	}

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSql(Map<String, Object> parametros) {

		StringBuilder sql = new StringBuilder();

		String formatToDate = ("'dd/MM/yyyy hh24:mi:ss'");
		SimpleDateFormat formatSemHora = new SimpleDateFormat("dd/MM/yyyy");

		Date dataCadastroInicial = (Date) parametros.get("DATA_CADASTRO_INICIAL");
		Date dataCadastroFinal = (Date) parametros.get("DATA_CADASTRO_FINAL");
		Integer empresaId = (Integer) parametros.get("EMPRESA_ID");
		Integer puntoVentaId = (Integer) parametros.get("PUNTOVENTA_ID");
		String puntoVentas = (String) parametros.get("NUMPUNTOVENTA");

		sql.append("SELECT empresa.NOMBEMPRESA AS \"empresa\", ");
		sql.append("puntoVenta.NUMPUNTOVENTA   AS \"codigoPuntoVenta\", ");
		sql.append("puntoVenta.NOMBPUNTOVENTA  AS \"puntoVenta\", ");
		sql.append("tipoPuntoVenta.DESCTIPO    AS \"tipoPuntoVenta\", ");
		sql.append("COUNT(cliente.CLIENTE_ID)  AS \"quantidadeCadastrada\" ");

		sql.append("FROM CLIENTE cliente ");
		sql.append("INNER JOIN USUARIO                    usuario ON usuario.USUARIO_ID             = cliente.USUARIO_ID ");
		sql.append("INNER JOIN USUARIO_UBICACION usuarioUbicacion ON usuario.USUARIO_ID             = usuarioUbicacion.USUARIO_ID ");
		sql.append("INNER JOIN PUNTO_VENTA             puntoVenta ON usuarioUbicacion.PUNTOVENTA_ID = puntoVenta.PUNTOVENTA_ID ");
		sql.append("INNER JOIN TIPO_PTOVTA         tipoPuntoVenta ON tipoPuntoVenta.TIPOPTOVTA_ID   = puntoVenta.TIPOPTOVTA_ID ");
		sql.append("LEFT JOIN EMPRESA                     empresa ON empresa.EMPRESA_ID             = cliente.EMPRESA_ID ");

		sql.append("WHERE cliente.ACTIVO = 1 ");
		sql.append("AND usuarioUbicacion.ACTIVO = 1 ");
		sql.append("AND usuarioUbicacion.PADRAO = 1 ");
		sql.append("AND usuario.ACTIVO = 1 ");

		if (puntoVentas != null && !puntoVentas.isEmpty()) {
			sql.append("AND puntoVenta.PUNTOVENTA_ID IN (" + puntoVentas + ") ");
		}
		if (empresaId != null && empresaId.intValue() != -1) {
			sql.append("AND empresa.EMPRESA_ID = " + empresaId + " ");
		}
		if (dataCadastroInicial != null && dataCadastroFinal != null) {
			sql.append("AND cliente.FECCADASTRO BETWEEN TO_DATE('" + formatSemHora.format(dataCadastroInicial) + " 00:00:00', " + formatToDate + ") "
					+ "AND TO_DATE('" + formatSemHora.format(dataCadastroFinal) + " 23:59:59', " + formatToDate + ") ");
		}

		sql.append("GROUP BY empresa.NOMBEMPRESA,");
		sql.append("puntoVenta.NUMPUNTOVENTA,");
		sql.append("puntoVenta.NOMBPUNTOVENTA,");
		sql.append("tipoPuntoVenta.DESCTIPO");

		return sql.toString();
	}
}