package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Calendar;
import java.util.Date;
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 RelatorioMovimentoPorOrgaoConcedente extends Relatorio {
	
	public RelatorioMovimentoPorOrgaoConcedente(Map<String, Object> parametros, Connection conexao) throws Exception {
		super(parametros, conexao);

		this.setCustomDataSource(new ArrayDataSource(this) {
			@Override
			public void initDados() throws Exception {
				
				Connection conexao = this.relatorio.getConexao();
				Map<String, Object> parametros = this.relatorio.getParametros();
				
				NamedParameterStatement stmt = new NamedParameterStatement(conexao, getSql());
				
				Calendar dataInicial = Calendar.getInstance();
				dataInicial.setTime((Date) parametros.get("DATA_DE"));
				
				Calendar dataFinal = Calendar.getInstance();
				dataFinal.setTime((Date) parametros.get("DATA_ATE"));
				
				Integer empresaId  = (Integer) parametros.get("EMPRESA_ID");
				stmt.setInt("empresa_id", empresaId);
				
				if(parametros.get("ORGAOCONCEDENTE_ID") != null && !"".equals(parametros.get("ORGAOCONCEDENTE_ID"))){
					stmt.setInt("orgaoconcedenteId",(Integer)parametros.get("ORGAOCONCEDENTE_ID"));
				}
				
				if(parametros.get("TIPOSERVICIO_ID") != null && !"-1".equals(parametros.get("TIPOSERVICIO_ID"))){
					stmt.setInt("tiposervicio_id", Integer.parseInt((String)parametros.get("TIPOSERVICIO_ID")));
				}
				
				stmt.setDate("DATA_DE", (java.sql.Date) parametros.get("DATA_DE"));
				stmt.setDate("DATA_ATE", (java.sql.Date) parametros.get("DATA_ATE"));
				
				ResultSet rset = stmt.executeQuery();
				
				while (rset.next()) {
					Map<String, Object> dataResult = new HashMap<String, Object>();
					dataResult.put("SECCOES", rset.getString("PORIGDESCPARADA") +"  "+ rset.getString("PDESTDESCPARADA"));
					dataResult.put("KM", rset.getString("TCANTKMREAL"));
					
					dataResult.put("SENTIDO", rset.getString("RUSENTIDO"));
					dataResult.put("SOMA", rset.getString("QTD"));
					
					Double m1 = Double.parseDouble(rset.getString("QTD"));
					Double m2 = Double.parseDouble(rset.getString("TARIFA"));
					
					dataResult.put("TOTAL", String.format("%.02f",m1*m2));
					dataResult.put("TARIFA",rset.getString("TARIFA"));
					dataResult.put("SERVICO",rset.getString("SERVICO") != null ? rset.getString("SERVICO") : "-" );

					this.dados.add(dataResult);
				} 
				this.resultSet = rset;
				
			}
		});
	}	
	
	private String getSql() {
		StringBuilder sql = new StringBuilder();
		
		sql.append(" 	WITH boletos AS	 ");
		sql.append(" 	  (SELECT b.boleto_id   AS bboleto_id,	 ");
		sql.append(" 	    b.ruta_id           AS bruta_id,	 ");
		sql.append(" 	    b.ORIGEN_ID         AS bORIGEN_ID,	 ");
		sql.append(" 	    b.DESTINO_ID        AS bDESTINO_ID,	 ");
		sql.append(" 	    b.CORRIDA_ID        AS bCORRIDA_ID,	 ");
		sql.append(" 	    b.FECCORRIDA        AS bFECCORRIDA,	 ");
		sql.append(" 	    b.FECHORVIAJE       AS bFECHORVIAJE ,	 ");
		sql.append(" 	    b.EMPRESACORRIDA_ID AS bEMPRESACORRIDA_ID,	 ");
		sql.append(" 	    r.INDSENTIDOIDA     AS rINDSENTIDOIDA	 ");
		sql.append(" 	  FROM boleto b	 ");
		sql.append(" 	  INNER JOIN empresa e	 ");
		sql.append(" 	  ON e.empresa_id         = b.empresacorrida_Id	 ");
		sql.append(" 	  AND b.empresacorrida_Id = :empresa_id	 ");
		if(parametros.get("LINHA_ID") != null ){
			sql.append(" 	  AND b.ruta_Id          IN(" +parametros.get("LINHA_ID")+ " )	 ");
		}
		sql.append(" 	  INNER JOIN ruta r	 ");
		sql.append(" 	  ON r.ruta_id = b.ruta_id	 ");
		
		sql.append(" 	  INNER JOIN corrida c	 ");
		sql.append(" 	  ON c.corrida_id = b.corrida_id  AND b.FECCORRIDA  = c.FECCORRIDA ");
		
		sql.append(" 	  WHERE b.FECCORRIDA BETWEEN :DATA_DE AND :DATA_ATE ");
		sql.append(" 	  AND b.MOTIVOCANCELACION_ID IS NULL	 ");
		
		if(parametros.get("SERVICO_ID") != null ){
			sql.append(" 	  AND b.corrida_id     IN(" +parametros.get("SERVICO_ID")+ ")	 ");
		}
		if(parametros.get("ORGAOCONCEDENTE_ID") != null && !"".equals(parametros.get("ORGAOCONCEDENTE_ID"))){
			sql.append(" 	  and r.ORGAOCONCEDENTE_ID = :orgaoconcedenteId	 ");
		}
		if(parametros.get("TIPOSERVICIO_ID") != null && !"-1".equals(parametros.get("TIPOSERVICIO_ID"))){
		sql.append(" 	  AND c.tiposervicio_id = :tiposervicio_id");  
	}
		
		sql.append(" 	  ) ,	 ");
		sql.append(" 	  combinacion AS	 ");
		sql.append(" 	  ( SELECT DISTINCT rc.ruta_id AS rcruta_id,	 ");
		sql.append(" 	    rc.tramo_id                AS rctramo_id,	 ");
		sql.append(" 	    porig.descparada           AS porigdescparada,	 ");
		sql.append(" 	    porig.parada_id            AS porigparada_id,	 ");
		sql.append(" 	    pdest.descparada           AS pdestdescparada,	 ");
		sql.append(" 	    pdest.parada_id            AS pdestparada_id,	 ");
		sql.append(" 	    t.CANTKMREAL               AS tCANTKMREAL,	 ");
		sql.append(" 	    ta.PRECIO                  AS taPRECIO,	 ");
		sql.append(" 	    ru.indsentidoida                  AS rusentido	 ");
		sql.append(" 	  FROM ruta_combinacion rc	 ");
		sql.append(" 	  INNER JOIN tramo t	 ");
		sql.append(" 	  ON t.tramo_id = rc.tramo_id	 ");
		sql.append(" 	  INNER JOIN parada porig	 ");
		sql.append(" 	  ON porig.parada_id = t.origen_id	 ");
		sql.append(" 	  INNER JOIN parada pdest	 ");
		sql.append(" 	  ON pdest.parada_id = t.destino_id	 ");
		sql.append(" 	  INNER JOIN boletos b	 ");
		sql.append(" 	  ON b.bruta_id = rc.ruta_id	 ");
		sql.append(" 	  INNER JOIN tarifa ta	 ");
		sql.append(" 	  ON ta.tramo_id         = t.tramo_id	 ");
		sql.append(" 	  INNER JOIN ruta ru	 ");
		sql.append(" 	  ON ru.ruta_id = rc.ruta_id	 ");
		sql.append(" 	    ) ,	 ");
		sql.append(" 	  resultado AS	 ");
		sql.append(" 	  (SELECT *	 ");
		sql.append(" 	  FROM combinacion c	 ");
		sql.append(" 	  LEFT JOIN boletos b	 ");
		sql.append(" 	  ON c.porigparada_id  = b.bORIGEN_ID	 ");
		sql.append(" 	  AND c.pdestparada_id = b.bdestino_ID	 ");
		sql.append(" 	  )	 ");
		sql.append(" 	SELECT RCRUTA_ID,	 ");
		sql.append(" 	  RCTRAMO_ID,	 ");
		sql.append(" 	  PORIGDESCPARADA,	 ");
		sql.append(" 	  PORIGPARADA_ID,	 ");
		sql.append(" 	  PDESTDESCPARADA,	 ");
		sql.append(" 	  PDESTPARADA_ID,	 ");
		sql.append(" 	  TCANTKMREAL,	 ");
		sql.append(" 	  taPRECIO          AS TARIFA,	 ");
		sql.append(" 	  COUNT(BBOLETO_ID) AS QTD,	 ");
		sql.append(" 	  BRUTA_ID,	 ");
		sql.append(" 	  BORIGEN_ID,	 ");
		sql.append(" 	  BDESTINO_ID,	 ");
		sql.append(" 	  BCORRIDA_ID as servico,	 ");
		sql.append(" 	  BFECCORRIDA,	 ");
		sql.append(" 	  BFECHORVIAJE,	 ");
		sql.append(" 	  BEMPRESACORRIDA_ID,	 ");
		sql.append(" 	  RINDSENTIDOIDA,	 ");
		sql.append(" 	  rusentido	 ");
		sql.append(" 	FROM resultado	 ");
		sql.append(" 	GROUP BY RCRUTA_ID,	 ");
		sql.append(" 	  RCTRAMO_ID,	 ");
		sql.append(" 	  PORIGDESCPARADA,	 ");
		sql.append(" 	  PORIGPARADA_ID,	 ");
		sql.append(" 	  PDESTDESCPARADA,	 ");
		sql.append(" 	  PDESTPARADA_ID,	 ");
		sql.append(" 	  TCANTKMREAL,	 ");
		sql.append(" 	  taPRECIO,	 ");
		sql.append(" 	  BRUTA_ID,	 ");
		sql.append(" 	  BORIGEN_ID,	 ");
		sql.append(" 	  BDESTINO_ID,	 ");
		sql.append(" 	  BCORRIDA_ID, ");
		sql.append(" 	  BFECCORRIDA,	 ");
		sql.append(" 	  BFECHORVIAJE,	 ");
		sql.append(" 	  BEMPRESACORRIDA_ID,	 ");
		sql.append(" 	  RINDSENTIDOIDA ,	 ");
		sql.append(" 	  rusentido 	 ");
		sql.append(" 	  order by PORIGDESCPARADA, PDESTDESCPARADA, rusentido");
		
		return sql.toString();
	}

	@Override
	protected void processaParametros() throws Exception {
	}
}