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

	public RelatorioPassageirosViajarDetalhado(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("NUMERO", rset.getString("NUMERO"));
					dataResult.put("NOME", trataCampoNull(rset.getString("NOME")));
					dataResult.put("RG", trataCampoNull(rset.getString("RG")));
					dataResult.put("LOCALIZADOR", trataCampoNull(rset.getString("LOCALIZADOR")));
					dataResult.put("ENDERECO", trataCampoNull(rset.getString("ENDERECO")));
					dataResult.put("NUMTELEFONO", trataCampoNull(rset.getString("NUMTELEFONO")));
					dataResult.put("AGENTE", trataCampoNull(rset.getString("AGENTE")));
					dataResult.put("CONTROLE", trataCampoNull(rset.getString("CONTROLE")));
					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_INICIO");
		Date dataCadastroFinal = (Date) parametros.get("DATA_FINAL");
		String passagemAberta = (String) parametros.get("PASSAGEM_ABERTA");
		String empresaId = (String) parametros.get("EMPRESA_ID");
		String categorias = (String) parametros.get("LS_CATEGORIA");
		Integer usuario = (Integer) parametros.get("USUARIO");
		String servico = (String) parametros.get("CORRIDA_ID");
		
		sql.append(" SELECT ROWNUM AS NUMERO, ");
		sql.append("        NOME, ");
		sql.append("        RG, "); 
		sql.append("        LOCALIZADOR, ");
		sql.append("        ENDERECO, ");
		sql.append("        NUMTELEFONO, ");
		sql.append("        AGENTE, ");
        sql.append("        CONTROLE ");
        sql.append("   FROM( ");
		sql.append(" SELECT ");
		sql.append("        B.NOMBPASAJERO AS NOME, ");
		sql.append("        DESCNUMDOC AS RG, "); 
		sql.append("        B.INFOPASAJERO AS LOCALIZADOR, ");
		sql.append("        B.DESCENDERECO AS ENDERECO, ");
		sql.append("        B.DESCTELEFONO AS NUMTELEFONO, ");
		sql.append("        U.CVEUSUARIO AS AGENTE, ");
        sql.append("        ' ' AS CONTROLE ");
        sql.append("   FROM BOLETO B INNER JOIN USUARIO U ON (B.USUARIO_ID = U.USUARIO_ID) ");
        sql.append("  WHERE ((B.INDSTATUSBOLETO = 'V' AND B.MOTIVOCANCELACION_ID IS NULL) OR (TIPOVENTA_ID = 15 AND B.MOTIVOCANCELACION_ID IS NULL))  "+passagemAberta+" ");
		if (dataCadastroInicial != null && dataCadastroFinal != null) {
			sql.append("AND B.FECCREACION BETWEEN TO_DATE('" + formatSemHora.format(dataCadastroInicial) + " 00:00:00', " + formatToDate + ") "
					+ "AND TO_DATE('" + formatSemHora.format(dataCadastroFinal) + " 23:59:59', " + formatToDate + ") ");
		}
		if (empresaId != null && !empresaId.equals("")  && !empresaId.equals("-1")) {
			sql.append("  AND B.EMPRESACORRIDA_ID     = "+empresaId+" ");
		}
		if (categorias != null && !categorias.equals("")  && !categorias.equals("-1")) {
			sql.append("  AND B.CATEGORIA_ID IN "+categorias+" ");
		}
		
		if (servico != null && !servico.equals("")  && !servico.equals("-1")) {
			sql.append("  AND B.CORRIDA_ID = "+servico+" ");
		}
		sql.append("  ORDER BY 1 ");
		sql.append(")  ");
		
		return sql.toString();
	}
	
	private String trataCampoNull(String campo) {
		if (campo != null && !campo.isEmpty() && campo.equalsIgnoreCase("null")) {
			return "";
		}
		return campo;
	}
}
