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.RelatorioGratuidadeANTTBean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

public class RelatorioGratuidadeANTT extends Relatorio {

	private List<RelatorioGratuidadeANTTBean> lsDadosRelatorio;
	
	public RelatorioGratuidadeANTT(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").toString() + " 00:00:00";
				}
				String fecFinalVenda = null;
				if (parametros.get("fecFinalVenda") != null) {
					fecFinalVenda = parametros.get("fecFinalVenda").toString() + " 23:59:59";
				}
				
				String tipGratuIds = parametros.get("tipGratuIds").toString();
				String linhaIds = parametros.get("linhaIds").toString();
				String empresa = parametros.get("empresa") != null ? parametros.get("empresa").toString() : "";
						
				String sql = getSql(fecInicioVenda, fecFinalVenda, linhaIds, tipGratuIds, empresa);
		
				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(empresa != null && !empresa.equals("")){
					stmt.setInt("empresa_id", Integer.parseInt(empresa));
				}
				
				ResultSet rset = null;
		
				rset = stmt.executeQuery();
		
				lsDadosRelatorio = new ArrayList<RelatorioGratuidadeANTTBean>();
				
				while (rset.next()) {
					RelatorioGratuidadeANTTBean gratuidadeBean = new RelatorioGratuidadeANTTBean();
					
					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.setTotIda(rset.getInt("totalIda"));
					gratuidadeBean.setTotVolta(rset.getInt("totalVolta"));


					lsDadosRelatorio.add(gratuidadeBean);
				}

				if (lsDadosRelatorio.size() > 0) {
					setLsDadosRelatorio(lsDadosRelatorio);
				}
			}
		});
	}
	
	public void setLsDadosRelatorio(List<RelatorioGratuidadeANTTBean> 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 empresa ) {

		
	
		StringBuilder sb = new StringBuilder();

		sb.append("	 ");
		sb.append("	select  tabela.categoria, tabela.codOrigem, tabela.descorigem, tabela.codDestino, tabela.descDestino, ");
		sb.append("    sum(CASE");
		sb.append("               WHEN (tabela.sentido = 1) THEN 1 ");
		sb.append("               ELSE 0");
		sb.append("           END) AS totalIda,");
		sb.append("       sum(CASE");
		sb.append("               WHEN (tabela.sentido = 0) THEN 1 ");
		sb.append("               ELSE 0");
		sb.append("           END) AS totalVolta from ( ");
		sb.append("	");
		sb.append("SELECT   ca.desccategoria as categoria, R.INDSENTIDOIDA as sentido, B.MOTIVOCANCELACION_ID, OC.DESCORGAO AS ORGAO, ");
		sb.append("       TO_DATE(B.FECHORVIAJE, 'DD/MM/YY hh24:mi:ss') || '' AS dataViagem,");
		sb.append("       TO_CHAR(b.FECHORVIAJE, 'HH24:MI') AS horaViagem,");
		sb.append("       ori.cveparada AS codorigem,");
		sb.append("       ori.descparada AS descorigem,");
		sb.append("       des.cveparada AS coddestino,");
		sb.append("       des.descparada AS descdestino,");
		sb.append("       B.NUMASIENTO AS POLTRONA,");
		sb.append("       b.NUMFOLIOSISTEMA AS NUMBILHETE,");
		sb.append("       b.NOMBPASAJERO AS NOMBPASAJERO,");
		sb.append("       CASE");
		sb.append("           WHEN b.DESCNUMDOC IS NOT NULL THEN b.DESCNUMDOC");
		sb.append("           ELSE c.NUMIDENTIFICAUNO");
		sb.append("       END AS RG,");
		sb.append("       c.TIPOIDENTIFICAUNO_ID AS TIPODOC1,");
		sb.append("       b.descorgaodoc uforgaodoc,");
		sb.append("       c.TIPOIDENTIFICADOS_ID AS TIPODOC2,");
		sb.append("       CASE");
		sb.append("           WHEN b.DESCNUMDOC2 IS NOT NULL THEN b.DESCNUMDOC2");
		sb.append("           ELSE c.NUMIDENTIFICADOS");
		sb.append("       END AS CPF,");
		sb.append("       r.PREFIXO AS LINHA,");
		sb.append("       cd.DESCCALLE || ', ' || cd.NUMEXTERIOR || '-' || cd.DESCIUDAD || '/' || cd.DESESTADO AS ENDERECO,");
		sb.append("       c.NUMTELEFONO AS tel,");
		sb.append("       c.DESCCORREO AS email,");
		sb.append("       CASE");
		sb.append("           WHEN B.MOTIVOCANCELACION_ID IN (31,");
		sb.append("                                           32,");
		sb.append("                                           90) THEN 1");
		sb.append("           ELSE 0");
		sb.append("       END AS DESISTENCIA,");
		sb.append("       (COALESCE(T.PRECIO, 0) + COALESCE(T.IMPORTEPEDAGIO, 0)) -(COALESCE(b.PRECIOPAGADO, 0) + COALESCE(b.IMPORTEPEDAGIO, 0)) AS vlrGratuidade ");
		sb.append("FROM BOLETO b ");
		sb.append("JOIN categoria ca ON b.categoria_id = ca.categoria_id ");
		sb.append("JOIN empresa e ON e.empresa_id = b.EMPRESACORRIDA_ID ");
		sb.append("JOIN marca m ON m.EMPRESA_ID = e.EMPRESA_ID ");
		sb.append("JOIN parada ori ON ori.parada_id = b.origen_id ");
		sb.append("JOIN parada des ON des.parada_id = b.destino_id ");
		sb.append("JOIN ruta r ON r.ruta_id = b.ruta_id ");
		sb.append("JOIN ruta_combinacion rc ON rc.ruta_id = r.ruta_id ");
		sb.append("JOIN tramo tr on (tr.tramo_id=rc.tramo_id and ori.parada_id=tr.origen_id and des.parada_id=tr.destino_id) ");		
		sb.append("LEFT JOIN cliente c ON c.cliente_id = b.cliente_id ");
		sb.append("LEFT JOIN CLIENTE_DIRECCION cd ON cd.cliente_id = c.cliente_id ");
		sb.append("AND cd.ACTIVO = 1 ");
		sb.append("JOIN ORGAO_CONCEDENTE OC ON r.ORGAOCONCEDENTE_ID = OC.ORGAOCONCEDENTE_ID ");
		sb.append("JOIN TARIFA T ON r.RUTA_ID = T.RUTA_ID ");
		sb.append("AND b.ORIGEN_ID = T.ORIGEN_ID ");
		sb.append("AND b.DESTINO_ID = T.DESTINO_ID ");
		sb.append("AND b.CLASESERVICIO_ID = T.CLASESERVICIO_ID ");
		sb.append("AND m.MARCA_ID = T.MARCA_ID ");
		sb.append("AND tr.tramo_id = T.TRAMO_ID ");
		sb.append("AND oc.ORGAOCONCEDENTE_ID = T.ORGAOCONCEDENTE_ID ");
		sb.append("JOIN VIGENCIA_TARIFA vt ON vt.VIGENCIATARIFA_ID = t.VIGENCIATARIFA_ID ");
		sb.append("AND b.FECHORVIAJE BETWEEN vt.FECINICIOVIGENCIA AND vt.FECFINVIGENCIA ");
		sb.append("WHERE m.activo=1 and rc.activo=1 and tr.activo=1 and b.fechorventa  BETWEEN :fecInicioVenda AND :fecFinalVenda ");
		sb.append("AND (b.MOTIVOCANCELACION_ID not in (4) or b.MOTIVOCANCELACION_ID is null) ");
		
		if( tipoGratu != null ) {
			sb.append(" AND b.CATEGORIA_ID in (").append(tipoGratu).append(") ");
		}
		
		if( linha != null && !linha.equals("Todas")) {
			sb.append(" AND r.ruta_id in (").append(linha).append(") ");
		}
		
		if (!empresa.isEmpty()){
			sb.append("AND b.empresacorrida_id =:empresa_id  ");
		}

		sb.append("GROUP BY  OC.DESCORGAO,");
		sb.append("         B.FECHORVIAJE,");
		sb.append("         ca.desccategoria,");
		sb.append("         ori.cveparada,");
		sb.append("         ori.descparada,");
		sb.append("         des.cveparada,");
		sb.append("         B.NUMASIENTO,");
		sb.append("         des.descparada,");
		sb.append("         c.TIPOIDENTIFICAUNO_ID,");
		sb.append("         c.TIPOIDENTIFICADOS_ID,");
		sb.append("         b.FECCORRIDA,");
		sb.append("         C.NUMTELEFONO,");
		sb.append("         c.DESCCORREO,");
		sb.append("         CASE");
		sb.append("             WHEN b.DESCNUMDOC IS NOT NULL THEN b.DESCNUMDOC");
		sb.append("             ELSE c.NUMIDENTIFICAUNO");
		sb.append("         END,");
		sb.append("         b.NUMFOLIOSISTEMA,");
		sb.append("         CASE");
		sb.append("             WHEN b.DESCNUMDOC2 IS NOT NULL THEN b.DESCNUMDOC2");
		sb.append("             ELSE c.NUMIDENTIFICADOS");
		sb.append("         END,");
		sb.append("         b.NOMBPASAJERO,");
		sb.append("         b.NUMIDENTIFICACION,");
		sb.append("         T.PRECIO,");
		sb.append("         b.PRECIOPAGADO,");
		sb.append("         b.descorgaodoc,");
		sb.append("         r.PREFIXO,");
		sb.append("         cd.DESCCALLE || ', ' || cd.NUMEXTERIOR || '-' || cd.DESCIUDAD || '/' || cd.DESESTADO,");
		sb.append("         B.MOTIVOCANCELACION_ID,");
		sb.append("         T.IMPORTEOUTROS,");
		sb.append("         T.IMPORTEPEDAGIO,");
		sb.append("         T.IMPORTESEGURO,");
		sb.append("         T.IMPORTETAXAEMBARQUE,");
		sb.append("         T.IMPORTETPP,");
		sb.append("         b.descorgaodoc,");
		sb.append("         b.IMPORTECATEGORIA,");
		sb.append("         b.IMPORTEOUTROS,");
		sb.append("         b.IMPORTEPEDAGIO,");
		sb.append("         b.IMPORTESEGURO,");
		sb.append("         b.IMPORTETAXAEMBARQUE,");
		sb.append("         b.IMPORTETPP,R.INDSENTIDOIDA");
		sb.append("         ORDER BY ");
		sb.append("     descorigem,");
		sb.append("         descdestino,OC.DESCORGAO,");
		sb.append("         b.FECHORVIAJE");
		sb.append("       ");
		sb.append("		 ) tabela");
		sb.append("         group by ");
		sb.append("         tabela.categoria, tabela.codOrigem,tabela.descOrigem, tabela.codDestino, tabela.descDestino ");
		sb.append(" ORDER BY tabela.descOrigem, tabela.descDestino, tabela.categoria ");
		

		
		return sb.toString();
	}
}