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.Map;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.ArrayCustomDataSourceRelatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utils.FormataUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

public class RelatorioHistoricoCompras extends Relatorio {

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

	@Override
	protected void processaParametros() throws Exception {
		setCustomDataSource(new ArrayCustomDataSource(this));
	}

	private final class ArrayCustomDataSource extends ArrayCustomDataSourceRelatorio {
		private ArrayCustomDataSource(Relatorio relatorio) throws Exception {
			super(relatorio);
		}

		@Override
		protected void getSql(StringBuilder instrucaoSql, Map<String, Object> parametros) {
			instrucaoSql.append(" SELECT ");
			instrucaoSql.append("     ca.fechorventa_h venda, ");
			instrucaoSql.append("     ca.numfoliosistema bilhete, ");
			instrucaoSql.append("     ca.corrida_id servico, ");
			instrucaoSql.append("     o.descparada origem, ");
			instrucaoSql.append("     d.descparada destino, ");
			instrucaoSql.append("     u.cveusuario operador, ");
			instrucaoSql.append("     ca.preciopagado + ca.importeoutros + ca.importepedagio + ca.importeseguro + ca.importetaxaembarque valor, ");
			instrucaoSql.append("     ca.fechorviaje viagem, ");
			instrucaoSql.append("     ca.numasiento poltrona, ");
			instrucaoSql.append("     pv.numpuntoventa||'-'||pv.nombpuntoventa agencia, ");
			instrucaoSql.append("     cli.numtelefonodos celular, ");
			instrucaoSql.append("     cli.numtelefono telefone, ");
			instrucaoSql.append("     cli.numfax comercial, ");
			instrucaoSql.append("     cli.nombcliente nome, ");
			instrucaoSql.append("     CASE ");
			instrucaoSql.append("             WHEN cli.tipoidentificauno_id = 2 THEN cli.numidentificauno ");
			instrucaoSql.append("             WHEN cli.tipoidentificados_id = 2 THEN cli.numidentificados ");
			instrucaoSql.append("             ELSE NULL ");
			instrucaoSql.append("         END ");
			instrucaoSql.append("     cpf ");
			instrucaoSql.append(" FROM ");
			instrucaoSql.append("     caja ca ");
			instrucaoSql.append("     INNER JOIN cliente cli ON ca.clientecomprador_id = cli.cliente_id ");
			instrucaoSql.append("     INNER JOIN usuario u ON ca.usuario_id = u.usuario_id ");
			instrucaoSql.append("     INNER JOIN punto_venta pv ON ca.puntoventa_id = pv.puntoventa_id ");
			instrucaoSql.append("     INNER JOIN ruta r on ca.ruta_id = r.ruta_id ");
			instrucaoSql.append("     LEFT JOIN parada o ON ca.origen_id = o.parada_id ");
			instrucaoSql.append("     LEFT JOIN parada d ON ca.destino_id = d.parada_id ");
			
			if (parametros.get("dtVendaInicial") != null
					&& parametros.get("dtEmbarqueInicial") != null) {
				instrucaoSql.append(" WHERE ca.fechorventa_h BETWEEN :dt_venda_inicio and :dt_venda_fim ");
				instrucaoSql.append(" and ca.fechorviaje BETWEEN :dt_embarque_inicio and :dt_embarque_fim ");
			} else if (parametros.get("dtVendaInicial") != null) {
				instrucaoSql.append(" WHERE ca.fechorventa_h BETWEEN :dt_venda_inicio and :dt_venda_fim ");
			} else {
				instrucaoSql.append(" WHERE ca.fechorviaje BETWEEN :dt_embarque_inicio and :dt_embarque_fim ");
			}
			
			if (parametros.get("puntoVentaId") != null) {
				instrucaoSql.append(" and pv.puntoventa_id in("+parametros.get("puntoVentaId")+") ");
			}
			if (parametros.get("numRuta") != null) {
				instrucaoSql.append(" and r.numruta in ("+obtemIdsParametrizadosParaString(parametros.get("numRuta").toString())+ ") ");
			}
			if (parametros.get("clienteId") != null) {
				instrucaoSql.append(" and cli.cliente_id in("+parametros.get("clienteId")+") ");
			}
			instrucaoSql.append("order by ca.fechorventa_h");
		}

		@Override
		protected void populaValoresDataResult(Map<String, Object> dataResult, ResultSet resultSet) throws SQLException {
			dataResult.put("venda", FormataUtil.formataDataToString((Date)resultSet.getTimestamp("venda"), "", "dd/MM/yyyy hh:mm"));
			dataResult.put("bilhete", resultSet.getString("bilhete"));
			dataResult.put("servico", resultSet.getString("servico"));
			dataResult.put("origem", resultSet.getString("origem"));
			dataResult.put("destino", resultSet.getString("destino"));
			dataResult.put("operador", resultSet.getString("operador"));
			dataResult.put("valor", resultSet.getBigDecimal("valor"));
			dataResult.put("viagem", FormataUtil.formataDataToString((Date)resultSet.getTimestamp("viagem"), "", "dd/MM/yyyy hh:mm"));
			dataResult.put("poltrona", resultSet.getString("poltrona"));
			dataResult.put("agencia", resultSet.getString("agencia"));
			dataResult.put("celular", resultSet.getString("celular"));
			dataResult.put("telefone", resultSet.getString("telefone"));
			dataResult.put("comercial", resultSet.getString("comercial"));
			dataResult.put("nome", resultSet.getString("nome"));
			dataResult.put("cpf", resultSet.getString("cpf"));
		}

		@Override
		protected void configuraParametrosConsultaSql(Map<String, Object> parametros, NamedParameterStatement stmt) throws SQLException {
			if (parametros.get("dtVendaInicial") != null) {
				stmt.setTimestamp("dt_venda_inicio", new Timestamp(DateUtil.inicioFecha((Date) parametros.get("dtVendaInicial")).getTime()));
				stmt.setTimestamp("dt_venda_fim", new Timestamp(DateUtil.fimFecha((Date) parametros.get("dtVendaFinal")).getTime()));
			}
			
			if (parametros.get("dtEmbarqueInicial") != null) {
				stmt.setTimestamp("dt_embarque_inicio", new Timestamp(DateUtil.inicioFecha((Date) parametros.get("dtEmbarqueInicial")).getTime()));
				stmt.setTimestamp("dt_embarque_fim", new Timestamp(DateUtil.fimFecha((Date) parametros.get("dtEmbarqueFinal")).getTime()));
			}
		}

		public String obtemIdsParametrizadosParaString(String parametro) {
			String[] ids = parametro.split(", ");
			StringBuilder retorno = new StringBuilder();
			for (int i = 0; i < ids.length; i++) {
				if (isIntermediario(ids, i)) {
					retorno.append(", ");
				}
				retorno.append("'");
				retorno.append(ids[i]);
				retorno.append("'");
			}
			return retorno.toString();
		}

		private boolean isIntermediario(String[] ids, int i) {
			return (i > 0) && (i != ids.length);
		}

	}

}
