package com.rjconsultores.ventaboletos.relatorios.impl;

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

public class RelatorioDiferencasTransferencias extends Relatorio {

	public RelatorioDiferencasTransferencias(Map<String, Object> parametros, Connection conexao) throws Exception {
		super(parametros, conexao);

		this.setCustomDataSource(new ArrayDataSourceTransferencia(this));
	}

	@Override
	protected void processaParametros() throws Exception {
	}

	private final class ArrayDataSourceTransferencia extends ArrayDataSource {
		
		private static final String FILTRO_POR_TODOS = "-1";
		private static final String FIELD_VALOR_DIFERENCA = "valor_diferenca";
		private static final String FIELD_DATA_FINAL = "DATA_FINAL";
		private static final String FIELD_DATA_INICIAL = "DATA_INICIAL";
		private static final String FIELD_TOTAL_TRANSF = "total_transf";
		private static final String FIELD_CLASSE_TRANSF = "classe_transf";
		private static final String FIELD_TOTAL_ORIGINAL = "total_original";
		private static final String FIELD_CLASSE_ORIGINAL = "classe_original";
		private static final String FIELD_DESTINO = "destino";
		private static final String FIELD_ORIGEM = "origem";
		private static final String FIELD_BILHETE = "bilhete";
		private static final String FIELD_AGENCIA_TRANSF = "agencia_transf";
		private static final String FIELD_EMPRESA = "empresa";

		private ArrayDataSourceTransferencia(Relatorio relatorio) throws Exception {
			super(relatorio);
		}

		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);

			stmt.setTimestamp(FIELD_DATA_INICIAL, new Timestamp(DateUtil.inicioFecha((Date) parametros.get(FIELD_DATA_INICIAL)).getTime()));
			stmt.setTimestamp(FIELD_DATA_FINAL, new Timestamp(DateUtil.fimFecha((Date) parametros.get(FIELD_DATA_FINAL)).getTime()));

			ResultSet rset = stmt.executeQuery();

			while (rset.next()) {

				Map<String, Object> dataResult = new HashMap<String, Object>();

				dataResult.put(FIELD_EMPRESA, rset.getString(FIELD_EMPRESA));
				dataResult.put(FIELD_AGENCIA_TRANSF, rset.getString(FIELD_AGENCIA_TRANSF));
				dataResult.put(FIELD_BILHETE, rset.getString(FIELD_BILHETE));
				dataResult.put(FIELD_ORIGEM, rset.getString(FIELD_ORIGEM));
				dataResult.put(FIELD_DESTINO, rset.getString(FIELD_DESTINO));
				dataResult.put(FIELD_CLASSE_ORIGINAL, rset.getString(FIELD_CLASSE_ORIGINAL));
				dataResult.put(FIELD_TOTAL_ORIGINAL, rset.getBigDecimal(FIELD_TOTAL_ORIGINAL));
				dataResult.put(FIELD_CLASSE_TRANSF, rset.getString(FIELD_CLASSE_TRANSF));
				dataResult.put(FIELD_TOTAL_TRANSF, rset.getBigDecimal(FIELD_TOTAL_TRANSF));
				dataResult.put(FIELD_VALOR_DIFERENCA, rset.getBigDecimal(FIELD_TOTAL_TRANSF).subtract(rset.getBigDecimal(FIELD_TOTAL_ORIGINAL)));

				this.dados.add(dataResult);
			}

			this.resultSet = rset;
		}
		
		private String getSql(Map<String, Object> parametros) {
			StringBuilder sql = new StringBuilder();
			sql.append(" SELECT E.NOMBEMPRESA EMPRESA, PV.NOMBPUNTOVENTA AGENCIA_TRANSF, B.NUMFOLIOSISTEMA BILHETE, ");
			sql.append(" PO.DESCPARADA ORIGEM, PD.DESCPARADA DESTINO, CSO.DESCCLASE CLASSE_ORIGINAL, ");
			sql.append(" COALESCE(BO.PRECIOPAGADO,0) + COALESCE(BO.IMPORTEOUTROS,0) + "); 
			sql.append(" COALESCE(BO.IMPORTEPEDAGIO,0) + COALESCE(BO.IMPORTESEGURO,0) + "); 
			sql.append(" COALESCE(BO.IMPORTETAXAEMBARQUE,0) TOTAL_ORIGINAL, ");
			sql.append(" CS.DESCCLASE CLASSE_TRANSF,  ");
			sql.append(" COALESCE(B.PRECIOPAGADO,0) + COALESCE(B.IMPORTEOUTROS,0) +  ");
			sql.append(" COALESCE(B.IMPORTEPEDAGIO,0) + COALESCE(B.IMPORTESEGURO,0) + ");
			sql.append(" COALESCE(B.IMPORTETAXAEMBARQUE,0) TOTAL_TRANSF ");
			sql.append(" FROM BOLETO B ");
			sql.append(" INNER JOIN MARCA M ON B.MARCA_ID = M.MARCA_ID ");
			sql.append(" INNER JOIN EMPRESA E ON M.EMPRESA_ID = E.EMPRESA_ID ");
			sql.append(" INNER JOIN PUNTO_VENTA PV ON B.PUNTOVENTA_ID = PV.PUNTOVENTA_ID ");
			sql.append(" INNER JOIN BOLETO BO ON BO.BOLETO_ID = B.BOLETOORIGINAL_ID ");
			sql.append(" LEFT JOIN CLASE_SERVICIO CS ON CS.CLASESERVICIO_ID = B.CLASESERVICIO_ID ");
			sql.append(" LEFT JOIN CLASE_SERVICIO CSO ON CSO.CLASESERVICIO_ID = BO.CLASESERVICIO_ID ");
			sql.append(" LEFT JOIN PARADA PO ON PO.PARADA_ID = B.ORIGEN_ID  ");
			sql.append(" LEFT JOIN PARADA PD ON PD.PARADA_ID = B.DESTINO_ID ");
			sql.append(" WHERE B.TIPOVENTA_ID = 81 ");
			sql.append(" AND B.FECHORVENTA >= :DATA_INICIAL ");
			sql.append(" AND B.FECHORVENTA <= :DATA_FINAL ");
			if ((String)parametros.get("EMPRESA_ID") != null
					&& !filtrarTodos("EMPRESA_ID")) {
				sql.append(" AND M.EMPRESA_ID IN ("+parametros.get("EMPRESA_ID")+")");
			}
			if ((String)parametros.get("PUNTOVENTA_ID") != null
					&& !filtrarTodos("PUNTOVENTA_ID")) {
				sql.append(" AND B.PUNTOVENTA_ID IN ("+parametros.get("PUNTOVENTA_ID")+")");
			}
			
			sql.append(" ORDER BY E.NOMBEMPRESA, PV.NOMBPUNTOVENTA ");

			return sql.toString();
		}
		
		private boolean filtrarTodos(String parametro) {
			String ids = (String)parametros.get(parametro);
			for (int i = 0; i < ids.split(", ").length; i++) {
				if (FILTRO_POR_TODOS.equals(ids.split(", ")[i])) {
					return true;
				}
			}
			return false;
		}
	}

}
