package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Map;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.ArrayCustomDataSourceRelatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.gui.controladores.relatorios.vendabilheteidoso.ETipoPeriodoRelatorioPosicaoVendaBilheteIdoso;
import com.rjconsultores.ventaboletos.web.gui.controladores.relatorios.vendabilheteidoso.RelatorioPosicaoVendaBilheteIdosoController;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

public class RelatorioPosicaoVendaBilheteIdosoPorTrecho extends Relatorio {

	public RelatorioPosicaoVendaBilheteIdosoPorTrecho(Map<String, Object> parametros, Connection conexao) {
		super(parametros, conexao);
	}

	@Override
	protected void processaParametros() throws Exception {
		setCustomDataSource(new ArrayCustomDataSource(this));
	}

	private final class ArrayCustomDataSource extends ArrayCustomDataSourceRelatorio {

		public ArrayCustomDataSource(Relatorio relatorio) throws Exception {
			super(relatorio);
		}

		@Override
		protected void getSql(StringBuilder instrucaoSql, Map<String, Object> parametros) {
			instrucaoSql.append("SELECT R.DESCRUTA, CAT.DESCCATEGORIA, ");
			instrucaoSql.append("ORIGEM.DESCPARADA ORIGEM, ");
			instrucaoSql.append("DESTINO.DESCPARADA DESTINO, ");
			instrucaoSql.append("COUNT(C.CAJA_ID) QTDE, ");
			instrucaoSql.append("COALESCE(C.IMPORTETAXAEMBARQUE, 0) TAXA_EMBARQUE, ");
			instrucaoSql.append("COALESCE(C.PRECIOPAGADO, 0) + COALESCE(C.IMPORTEOUTROS, 0) +  ");
			instrucaoSql.append("COALESCE(C.IMPORTEPEDAGIO, 0) + COALESCE(C.IMPORTESEGURO, 0) +  ");
			instrucaoSql.append("COALESCE(C.IMPORTETAXAEMBARQUE, 0) FACIAL ");
			instrucaoSql.append("FROM CAJA C ");
			instrucaoSql.append("INNER JOIN RUTA R ON C.RUTA_ID = R.RUTA_ID ");
			instrucaoSql.append("INNER JOIN CATEGORIA CAT ON C.CATEGORIA_ID = CAT.CATEGORIA_ID ");
			instrucaoSql.append("INNER JOIN PARADA ORIGEM ON ORIGEM.PARADA_ID = C.ORIGEN_ID ");
			instrucaoSql.append("INNER JOIN PARADA DESTINO ON DESTINO.PARADA_ID = C.DESTINO_ID ");
			instrucaoSql.append("WHERE ");
			if (ETipoPeriodoRelatorioPosicaoVendaBilheteIdoso.VENDA.equals(
					(ETipoPeriodoRelatorioPosicaoVendaBilheteIdoso)parametros.get("tpData"))) {
				instrucaoSql.append("C.FECHORVENTA_H BETWEEN :dtInicial AND :dtFinal ");
			} else {
				instrucaoSql.append("C.FECCORRIDA BETWEEN :dtInicial AND :dtFinal ");
			}
			instrucaoSql.append("AND C.EMPRESACORRIDA_ID = :empresaId ");
			instrucaoSql.append("AND C.CATEGORIA_ID IN ("+parametros.get("categoriaId").toString()+") ");
			if (!RelatorioPosicaoVendaBilheteIdosoController.LISTAR_TODAS.equals(parametros.get("rutaId"))) {
				instrucaoSql.append("AND C.RUTA_ID IN ("+parametros.get("rutaId").toString()+") ");
			}
			instrucaoSql.append(" AND C.MOTIVOCANCELACION_ID IS NULL ");
			instrucaoSql.append("GROUP BY R.DESCRUTA,  ");
			instrucaoSql.append("CAT.DESCCATEGORIA, ");
			instrucaoSql.append("ORIGEM.DESCPARADA, ");
			instrucaoSql.append("DESTINO.DESCPARADA, ");
			instrucaoSql.append("COALESCE(C.IMPORTETAXAEMBARQUE, 0), ");
			instrucaoSql.append("COALESCE(C.PRECIOPAGADO, 0) + COALESCE(C.IMPORTEOUTROS, 0) +  ");
			instrucaoSql.append("COALESCE(C.IMPORTEPEDAGIO, 0) + COALESCE(C.IMPORTESEGURO, 0) +  ");
			instrucaoSql.append("COALESCE(C.IMPORTETAXAEMBARQUE, 0) ");
			instrucaoSql.append("ORDER BY R.DESCRUTA, CAT.DESCCATEGORIA ");
		}

		@Override
		protected void populaValoresDataResult(Map<String, Object> dataResult, ResultSet resultSet) throws SQLException {
			dataResult.put("origem", resultSet.getString("origem"));
			dataResult.put("destino", resultSet.getString("destino"));
			dataResult.put("total", resultSet.getBigDecimal("taxa_embarque"));
			dataResult.put("qtde", resultSet.getInt("qtde"));
			dataResult.put("facial", resultSet.getBigDecimal("facial"));
			dataResult.put("descRuta", resultSet.getString("descruta"));
			dataResult.put("descCategoria", resultSet.getString("desccategoria"));
		}

		@Override
		protected void configuraParametrosConsultaSql(Map<String, Object> parametros, NamedParameterStatement stmt) throws SQLException {
			stmt.setTimestamp("dtInicial", new Timestamp(DateUtil.inicioFecha((Date) parametros.get("dtInicial")).getTime()));
			stmt.setTimestamp("dtFinal", new Timestamp(DateUtil.fimFecha((Date) parametros.get("dtFinal")).getTime()));
			stmt.setObject("empresaId", parametros.get("empresaId"));
		}
		
	}

}
