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 RelatorioCadastroClientesDetalhado extends Relatorio {

	public RelatorioCadastroClientesDetalhado(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("numFidelidade", rset.getString("numFidelidade"));
					dataResult.put("cliente", rset.getString("cliente"));
					dataResult.put("identificaUno", trataCampoNull(rset.getString("identificaUno")));
					dataResult.put("identificaDos", trataCampoNull(rset.getString("identificaDos")));
					dataResult.put("fecNascimento", rset.getDate("fecNascimento"));
					dataResult.put("celular", trataCampoNull(rset.getString("celular")));
					dataResult.put("telefone", trataCampoNull(rset.getString("telefone")));
					dataResult.put("fax", trataCampoNull(rset.getString("fax")));
					dataResult.put("email", rset.getString("email"));
					dataResult.put("sexo", rset.getString("sexo"));
					dataResult.put("fecCadastro", rset.getDate("fecCadastro"));
					dataResult.put("empresaId", rset.getInt("empresaId"));
					dataResult.put("codUsuario", rset.getString("codUsuario"));
					dataResult.put("usuario", rset.getString("usuario"));
					dataResult.put("codigoPuntoVenta", rset.getString("codigoPuntoVenta"));
					dataResult.put("puntoVenta", rset.getString("puntoVenta"));
					dataResult.put("descIdentificaUno", rset.getString("descIdentificaUno"));
					dataResult.put("descIdentificaDos", rset.getString("descIdentificaDos"));

					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 ");
		sql.append("(SELECT max(tarjetaFidelidad.NUMTARJETA) ");
		sql.append("FROM  CLIENTE_FIDELIDAD clienteFidelidad ");
		sql.append("INNER JOIN TARJETA_FIDELIDAD tarjetaFidelidad ON tarjetaFidelidad.TARJETAFIDELIDAD_ID = clienteFidelidad.TARJETAFIDELIDAD_ID ");
		sql.append("INNER JOIN EMPRESA           empresaFidelidad ON empresaFidelidad.EMPRESA_ID          = clienteFidelidad.EMPRESA_ID ");
		sql.append("WHERE tarjetaFidelidad.ACTIVO = 1 ");
		sql.append("AND clienteFidelidad.ACTIVO = 1 ");
		sql.append("AND empresaFidelidad.EMPRESA_ID = empresa.EMPRESA_ID ");
		sql.append("AND clienteFidelidad.CLIENTE_ID = cliente.CLIENTE_ID) AS \"numFidelidade\", ");
		sql.append("cliente.NOMBCLIENTE                AS \"cliente\", ");
		/*Foi feito esse CASE para forçar que o CPF fica no identificaUno e o RG identificaDos*/
		sql.append(" CASE ");
		sql.append(" 	WHEN CLIENTE.TIPOIDENTIFICAUNO_ID = 2 THEN cliente.NUMIDENTIFICAUNO ");
		sql.append(" 	WHEN CLIENTE.TIPOIDENTIFICADOS_ID = 2 THEN cliente.NUMIDENTIFICADOS ");
		sql.append(" 	ELSE '' ");
		sql.append(" END AS \"identificaUno\", ");
		sql.append("ti.DESCTIPO                        AS \"descIdentificaUno\", ");
		sql.append(" CASE ");
		sql.append(" 	WHEN CLIENTE.TIPOIDENTIFICAUNO_ID = 1 THEN cliente.NUMIDENTIFICAUNO ");
		sql.append(" 	WHEN CLIENTE.TIPOIDENTIFICADOS_ID = 1 THEN cliente.NUMIDENTIFICADOS ");
		sql.append(" 	ELSE '' ");
		sql.append(" END AS \"identificaDos\", ");
		sql.append("ti2.DESCTIPO                       AS \"descIdentificaDos\", ");
		sql.append("cliente.FECNACIMIENTO              AS \"fecNascimento\", ");
		sql.append("cliente.NUMTELEFONODOS             AS \"celular\", ");
		sql.append("cliente.NUMTELEFONO                AS \"telefone\", ");
		sql.append("cliente.NUMFAX                     AS \"fax\", ");
		sql.append("cliente.DESCCORREO                 AS \"email\", ");
		sql.append("cliente.INDSEXO                    AS \"sexo\", ");
		sql.append("cliente.FECCADASTRO                AS \"fecCadastro\", ");
		sql.append("cliente.EMPRESA_ID                 AS \"empresaId\", ");
		sql.append("usuario.CVEUSUARIO                 AS \"codUsuario\", ");
		sql.append("usuario.NOMBUSUARIO                AS \"usuario\", ");
		sql.append("puntoVenta.NUMPUNTOVENTA           AS \"codigoPuntoVenta\", ");
		sql.append("puntoVenta.NOMBPUNTOVENTA          AS \"puntoVenta\" ");

		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("LEFT JOIN TIPO_IDENTIFICACION ti  ON  ti.TIPOIDENTIFICACION_ID = CLIENTE.TIPOIDENTIFICAUNO_ID  ");
		sql.append("LEFT JOIN TIPO_IDENTIFICACION ti2 ON TI2.TIPOIDENTIFICACION_ID = CLIENTE.TIPOIDENTIFICADOS_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 (puntoVentaId != null && puntoVentaId.intValue() != -1) {
			sql.append("AND puntoVenta.PUNTOVENTA_ID = " + puntoVentaId + " ");
		}
		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 + ") ");
		}
		
		return sql.toString();
	}
	
	private String trataCampoNull(String campo) {
		if (campo != null && !campo.isEmpty() && campo.equalsIgnoreCase("null")) {
			return "";
		}
		return campo;
	}
}
