/**
 * 
 */
package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Timestamp;
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.service.ConstanteService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

/**
 * @author Bruno Neves <bruno@rjconsultores.com.br>
 * 
 */
public class RelatorioKmProgramada extends Relatorio {
	
	/**
	 * @param parametros
	 * @param conexao
	 */
	public RelatorioKmProgramada(Map<String, Object> parametros, Connection conexao) {
		super(parametros, conexao);
		// TODO Auto-generated constructor stub
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio#processaParametros()
	 */
	@Override
	public void processaParametros() throws Exception {
	}

	public RelatorioKmProgramada(Map<String, Object> parametros, Connection conexao, ConstanteService constanteService) 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);
				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
				stmt.setTimestamp("fecInicio", new Timestamp(DateUtil.inicioFecha(sdf.parse(parametros.get("DATA_INICIAL").toString())).getTime()));
				stmt.setTimestamp("fecFinal", new Timestamp(DateUtil.inicioFecha(sdf.parse( parametros.get("DATA_FINAL").toString())).getTime()));
				if(parametros.get("EMPRESA_ID" ) != null){
					stmt.setInt("empresaId", Integer.valueOf(parametros.get("EMPRESA_ID" ).toString()));
				}
				if(parametros.get("RUTA_ID" ) != null){
					stmt.setInt("rutaId", Integer.valueOf(parametros.get("RUTA_ID" ).toString()));
				}
	    		
				ResultSet rset = stmt.executeQuery();

				while (rset.next()) {
					Map<String, Object> dataResult = new HashMap<String, Object>();
					dataResult.put("Linhas", rset.getString("Linhas"));
					dataResult.put("DescLinha", rset.getString("DescLinha"));
					dataResult.put("Empresa", rset.getString("Empresa"));
					dataResult.put("KMPadrao", rset.getBigDecimal("KMPadrao"));
					dataResult.put("SRVNormal", rset.getInt("SRVNormal"));
					dataResult.put("SRVExtra", rset.getInt("SRVExtra"));
					dataResult.put("SRVTotal", rset.getInt("SRVTotal"));
					dataResult.put("KMTotal", rset.getBigDecimal("KMTotal"));
					
					
					this.dados.add(dataResult);
				}

				this.resultSet = rset;
			}
		});
	}

	private String getSql(Map<String, Object> parametros) {
		StringBuilder sql = new StringBuilder();
		sql.append(" select");
		sql.append(" geral.Linhas,");
		sql.append(" geral.Empresa,");
		sql.append(" geral.DescLinha,");
		sql.append(" geral.KMPadrao,");
		sql.append("   COUNT(");
		sql.append("  CASE");
		sql.append("    WHEN geral.TIPOSERVICIO_ID = 1");
		sql.append("    THEN 1");
		sql.append("    ELSE null");
		sql.append("  END) AS SRVNormal,");
		sql.append("  COUNT(");
		sql.append("  CASE");
		sql.append("    WHEN geral.TIPOSERVICIO_ID = 2");
		sql.append("    THEN 1");
		sql.append("    ELSE null");
		sql.append("  END)                AS SRVExtra,");
		sql.append("  NVL(geral.KMPadrao, 0 ) * (NVL( COUNT(");
		sql.append("  CASE");
		sql.append("    WHEN geral.TIPOSERVICIO_ID = 1");
		sql.append("    THEN 1");
		sql.append("    ELSE null");
		sql.append("  END), 0 ) + NVL( COUNT(");
		sql.append("  CASE");
		sql.append("    WHEN geral.TIPOSERVICIO_ID = 2");
		sql.append("    THEN 1");
		sql.append("    ELSE null");
		sql.append("  END), 0 )) as KMTotal,");

		sql.append("(NVL( COUNT(");
		sql.append("		  CASE");
		sql.append("	    WHEN geral.TIPOSERVICIO_ID = 1");
		sql.append("		    THEN 1");
		sql.append("		    ELSE null");
		sql.append("		  END), 0 ) + NVL( COUNT(");
		sql.append("		  CASE");
		sql.append("		    WHEN geral.TIPOSERVICIO_ID = 2");
		sql.append("		    THEN 1");
		sql.append("		    ELSE null");
		sql.append("		  END), 0 )) SRVTotal");
		
		sql.append(" from (SELECT  c.RUTA_ID AS Linhas,");                                                                                                                                              
		sql.append("  c.EMPRESACORRIDA_ID     AS Empresa,");
		sql.append("  r.DESCRUTA              AS DescLinha,");
		sql.append("  c.TIPOSERVICIO_ID,");
		sql.append("  (select sum(t.CANTKMREAL) from CORRIDA_TRAMO ct  inner join TRAMO t ON ct.TRAMO_ID = t.TRAMO_ID AND t.ACTIVO = 1 where ct.CORRIDA_ID  = c.CORRIDA_ID AND ct.ACTIVO = 1");
		sql.append(" AND ct.FECCORRIDA = c.FECCORRIDA ) AS KMPadrao");
		sql.append(" FROM CORRIDA c");
		sql.append(" JOIN RUTA r");
		sql.append(" ON c.RUTA_ID = r.RUTA_ID and R.ACTIVO=1");
		sql.append(" WHERE ");
		sql.append(" c.ACTIVO=1");
		sql.append(" and c.FECCORRIDA BETWEEN :fecInicio and  :fecFinal");
		
		if(parametros.get("EMPRESA_ID" ) != null){
			sql.append(" and c.EMPRESACORRIDA_ID = :empresaId ");
		}
		if(parametros.get("RUTA_ID" ) != null){
			sql.append(" and r.RUTA_ID = :rutaId ");
		}

		sql.append(") geral group by geral.Linhas, geral.Empresa, geral.DescLinha, geral.KMPadrao");
		
		return sql.toString();
	}
}
