package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioGratuidadeAGRBean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class RelatorioGratuidadeAGR extends Relatorio {

	private List<RelatorioGratuidadeAGRBean> lsDadosRelatorio;
	
	public RelatorioGratuidadeAGR(Map<String, Object> parametros, Connection conexao)  throws Exception {
		super(parametros, conexao);
		
		this.setCustomDataSource(new DataSource(this) {
			
			@Override
			public void initDados() throws Exception {

				Connection conexao = this.relatorio.getConexao();

				Map<String, Object> parametros = this.relatorio.getParametros();

				String fecInicioVenda = null;
				if (parametros.get("fecInicioVenda") != null) {
					fecInicioVenda = parametros.get("fecInicioVenda") + " 00:00:00";
				}
				String fecFinalVenda = null;
				if (parametros.get("fecFinalVenda") != null) {
					fecFinalVenda = parametros.get("fecFinalVenda")+ " 23:59:59";
				}
				
				String fecInicioViagem = null;
				if (parametros.get("fecInicioViagem") != null) {
					fecInicioViagem = parametros.get("fecInicioViagem") + " 00:00:00";
				}
				String fecFinalViagem = null;
				if (parametros.get("fecFinalViagem") != null) {
					fecFinalViagem = parametros.get("fecFinalViagem") + " 23:59:59";
				}
				
				String tipGratuIds = parametros.get("tipGratuIds").toString();
				String clienteIds = parametros.get("clienteIds").toString();
				String linhaIds = parametros.get("linhaIds").toString();
				String empresa = parametros.get("empresa") != null ? parametros.get("empresa").toString() : "";
						
				String sql = getSql(fecInicioVenda, fecFinalVenda, linhaIds, tipGratuIds, clienteIds, empresa, fecInicioViagem, fecFinalViagem);
		
				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);

				if (fecInicioVenda != null) {
					stmt.setTimestamp("fecInicioVenda", new java.sql.Timestamp(sdf.parse(fecInicioVenda).getTime()));
				}
				
				if (fecFinalVenda != null) {
					stmt.setTimestamp("fecFinalVenda", new java.sql.Timestamp(sdf.parse(fecFinalVenda).getTime()));
				}
				
				if (fecInicioViagem != null) {
					stmt.setTimestamp("fecInicioViagem", new java.sql.Timestamp(sdf.parse(fecInicioViagem).getTime()));
				}
				
				if (fecFinalViagem != null) {
					stmt.setTimestamp("fecFinalViagem", new java.sql.Timestamp(sdf.parse(fecFinalViagem).getTime()));
				}
				
				if(empresa != null && !empresa.equals("")){
					stmt.setInt("empresa_id", Integer.parseInt(empresa));
				}
				
				ResultSet rset = null;
		
				rset = stmt.executeQuery();
		
				lsDadosRelatorio = new ArrayList<RelatorioGratuidadeAGRBean>();
				
				while (rset.next()) {
					RelatorioGratuidadeAGRBean gratuidadeBean = new RelatorioGratuidadeAGRBean();
					
					gratuidadeBean.setCategoria(rset.getString("categoria"));

					gratuidadeBean.setDescOrigem(rset.getString("descorigem"));
					gratuidadeBean.setDescDestino(rset.getString("descdestino"));
					gratuidadeBean.setCodOrigem(rset.getString("codorigem"));
					gratuidadeBean.setCodDestino(rset.getString("coddestino"));
					
					gratuidadeBean.setDataViagem(rset.getString("dataviagem"));
					gratuidadeBean.setHoraViagem(rset.getString("horaviagem"));
					gratuidadeBean.setPoltrona(rset.getString("poltrona"));
					gratuidadeBean.setPassageiro(rset.getString("nombpasajero"));
					gratuidadeBean.setDoc1(rset.getString("doc1"));
					gratuidadeBean.setTipoDoc1(rset.getString("tipodoc1"));
					gratuidadeBean.setTipoDoc2(rset.getString("tipodoc2"));
					gratuidadeBean.setDoc2(rset.getString("doc2"));
					gratuidadeBean.setLinha(rset.getString("linha"));
					gratuidadeBean.setDescLinha(rset.getString("desclinha"));
					gratuidadeBean.setValor(rset.getBigDecimal("valor"));

					lsDadosRelatorio.add(gratuidadeBean);
				}

				if (lsDadosRelatorio.size() > 0) {
					setLsDadosRelatorio(lsDadosRelatorio);
				}
			}
		});
	}
	
	public void setLsDadosRelatorio(List<RelatorioGratuidadeAGRBean> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
	}

	@Override
	protected void processaParametros() throws Exception {
	}
	
	private String getSql(String fecInicioVenda, String fecFinalVenda, String linha, String tipoGratu, String cliente, String empresa, String fecInicioViagem, String fecFinalViagem ) {
	
		StringBuilder sql = new StringBuilder(3400);

		sql.append(" SELECT ");
		sql.append("     ca.desccategoria                                      AS categoria, ");
		sql.append("     to_date(b.fechorviaje, 'DD/MM/YY hh24:mi:ss') || ''   AS dataviagem, ");
		sql.append("     to_char(b.fechorviaje, 'HH24:MI')                     AS horaviagem, ");
		sql.append("     ori.cveparada                                         AS codorigem, ");
		sql.append("     ori.descparada                                        AS descorigem, ");
		sql.append("     des.cveparada                                         AS coddestino, ");
		sql.append("     des.descparada                                        AS descdestino, ");
		sql.append("     b.numasiento                                          AS poltrona, ");
		sql.append("     b.nombpasajero                                        AS nombpasajero, ");
		sql.append("     NVL(b.descnumdoc, c.numidentificauno)                 AS doc1,  ");
		sql.append("     c.tipoidentificauno_id                                AS tipodoc1, ");
		sql.append("     c.tipoidentificados_id                                AS tipodoc2,  ");
		sql.append("     NVL(b.descnumdoc2, c.numidentificados)                AS doc2, ");
		sql.append("     r.prefixo                                             AS linha, ");
		sql.append("     r.descruta                                            AS desclinha, ");
		sql.append("     NVL(t.precio, 0) + NVL(t.importepedagio, 0)           AS valor ");
		sql.append(" FROM boleto b ");
		sql.append(" JOIN categoria          ca ON b.categoria_id = ca.categoria_id ");
		sql.append(" JOIN empresa            e ON e.empresa_id = b.empresacorrida_id ");
		sql.append(" JOIN marca              m ON m.empresa_id = e.empresa_id ");
		sql.append(" JOIN parada             ori ON ori.parada_id = b.origen_id ");
		sql.append(" JOIN parada             des ON des.parada_id = b.destino_id ");
		sql.append(" JOIN ruta               r ON r.ruta_id = b.ruta_id ");
		sql.append(" JOIN ruta_combinacion   rc ON rc.ruta_id = r.ruta_id ");
		sql.append(" JOIN tramo              tr ON ( tr.tramo_id = rc.tramo_id ");
		sql.append(" 	         	   AND ori.parada_id = tr.origen_id ");
		sql.append(" 			   AND des.parada_id = tr.destino_id ) ");
		sql.append(" LEFT JOIN cliente            c  ON c.cliente_id = b.cliente_id ");
		sql.append(" LEFT JOIN cliente_direccion  cd ON cd.cliente_id = c.cliente_id ");
		sql.append(" 			        AND cd.activo = 1 ");
		sql.append(" JOIN orgao_concedente   oc ON r.orgaoconcedente_id = oc.orgaoconcedente_id ");
		sql.append(" JOIN tarifa             t ON r.ruta_id = t.ruta_id ");
		sql.append(" 		          AND b.origen_id = t.origen_id ");
		sql.append(" 		          AND b.destino_id = t.destino_id ");
		sql.append(" 		          AND b.claseservicio_id = t.claseservicio_id ");
		sql.append(" 		          AND m.marca_id = t.marca_id ");
		sql.append(" 		          AND tr.tramo_id = t.tramo_id ");
		sql.append(" 		          AND oc.orgaoconcedente_id = t.orgaoconcedente_id ");
		sql.append(" JOIN vigencia_tarifa    vt ON vt.vigenciatarifa_id = t.vigenciatarifa_id ");
		sql.append(" 		           AND b.fechorviaje BETWEEN vt.feciniciovigencia AND vt.fecfinvigencia ");
		sql.append(" WHERE ");
		sql.append("     m.activo = 1 ");
		sql.append("     AND rc.activo = 1 ");
		sql.append("     AND tr.activo = 1 ");
		
		if( fecInicioVenda != null && fecFinalVenda !=null ){
			sql.append("     AND b.fechorventa BETWEEN :fecInicioVenda AND :fecFinalVenda ");
		}
		
		if( fecInicioViagem != null && fecFinalViagem !=null ){			
			sql.append("     AND b.fechorviaje BETWEEN :fecInicioViagem AND :fecFinalViagem ");
		}
		
		sql.append("     AND ( b.motivocancelacion_id NOT IN ( 4 ) ");
		sql.append("           OR b.motivocancelacion_id IS NULL ) ");
		
		if( tipoGratu != null && !tipoGratu.equals("Todas")) {
			sql.append(" AND b.CATEGORIA_ID in (").append(tipoGratu).append(") ");
		}
		
		if( linha != null && !linha.equals("Todas")) {
			sql.append(" AND r.ruta_id in (").append(linha).append(") ");
		}
		
		if( cliente != null && !cliente.equals("Todas")) {
			sql.append(" AND b.cliente_id in (").append(cliente).append(") ");
		}
		
		if (!empresa.isEmpty()){
			sql.append("AND b.empresacorrida_id =:empresa_id  ");
		}

		sql.append(" GROUP BY ");
		sql.append("     ca.desccategoria, ");
		sql.append("     b.motivocancelacion_id, ");
		sql.append("     b.fechorviaje, ");
		sql.append("     ori.cveparada, ");
		sql.append("     ori.descparada, ");
		sql.append("     des.cveparada, ");
		sql.append("     des.descparada, ");
		sql.append("     b.numasiento, ");
		sql.append("     b.nombpasajero, ");
		sql.append("     NVL(b.descnumdoc, c.numidentificauno), ");
		sql.append("     c.tipoidentificauno_id, ");
		sql.append("     c.tipoidentificados_id, ");
		sql.append("     NVL(b.descnumdoc2, c.numidentificados), ");
		sql.append("     r.prefixo, ");
		sql.append("     r.descruta, ");
		sql.append("     NVL(t.precio, 0) + NVL(t.importepedagio, 0) ");
		sql.append(" ORDER BY ");
		sql.append("     NVL(b.descnumdoc2, c.numidentificados), ");
		sql.append("     NVL(b.descnumdoc, c.numidentificauno), ");
		sql.append("     b.nombpasajero, ");
		sql.append("     b.fechorviaje, ");
		sql.append("     descorigem, ");
		sql.append("     descdestino ");
				
		return sql.toString();
	}
	
}