package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.util.EnumSet;
import java.util.Map;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;

public class RelatorioLinhaOperacional extends Relatorio {

	public enum EnumEspecie {
		BILHETE("BILHETE DE PASSAGEM RODOVIÁRIO"), EXCESSO_BAGAGEM("DEMOSTRATIVO EXCESSO DE BAGAGEM");
		public static final EnumSet<EnumEspecie> all = EnumSet.of(BILHETE, EXCESSO_BAGAGEM);
		private String descricao;

		private EnumEspecie(String descricao) {
			this.descricao = descricao;
		}

		@Override
		public String toString() {
			return descricao;
		}
	}

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

	@Override
	protected void processaParametros() throws Exception {
		Map<String, Object> parametros = this.getParametros();

		EnumEspecie especie = (EnumEspecie) parametros.get("ESPECIE");
		String dataDe = (String) parametros.get("DATA_DE");
		dataDe = dataDe + " 00:00:00";
		String dataAte = (String) parametros.get("DATA_ATE");
		dataAte = dataAte + " 23:59:59";

		String linhasIds = (String) parametros.get("LINHAS");
		String empresaId = (String) parametros.get("EMPRESA_IDS");

		Boolean agruparPorDia = (Boolean) parametros.get("agruparPorDia");
		Boolean agruparPorMes = (Boolean) parametros.get("agruparPorMes");
		Boolean agruparPorAno = (Boolean) parametros.get("agruparPorAno");

		Boolean desconsiderarBilhetesDevolvidos = (Boolean) parametros.get("desconsiderarBilhetesDevolvidos");

		String sql = getSql(especie, dataDe, dataAte, linhasIds, empresaId, agruparPorDia, agruparPorMes, agruparPorAno, desconsiderarBilhetesDevolvidos);
		parametros.put("SQL", sql);
		parametros.put("STR_ESPECIE", especie.toString());
	}

	private String getSql(EnumEspecie especie, String dataDe, String dataAte, String linhasIds,
			String empresaId, Boolean agruparPorDia, Boolean agruparPorMes, Boolean agruparPorAno,
			Boolean desconsiderarBilhetesDevolvidos) {
		StringBuilder sql = new StringBuilder();

		sql.append(" SELECT ");
		sql.append("    ca.fechorventa data_venda, ");
		sql.append("    c.corrida_id corrida_id, ");
		sql.append("    c.feccorrida data_corrida, ");
		sql.append("    r.NUMRUTA codigo, ");
		sql.append("    r.PREFIXO prefixo, ");
		sql.append("    c.fechorsalida hora_saida, ");
		sql.append("    r.descruta linha, ");
		sql.append("    o.descparada origem, ");
		sql.append("    d.descparada destino, ");
		sql.append("    e.empresa_id empresaId, ");
		sql.append("    e.nombempresa empresa, ");
		sql.append("    COUNT(*) qtde_boletos ");

		switch (especie) {
		case BILHETE:
			sql.append(" FROM ");
			sql.append("    (  SELECT ");
			sql.append("            corrida_id, ");
			sql.append("            origen_id, ");
			sql.append("            destino_id, ");
			sql.append("            feccorrida, ");
			sql.append("            empresacorrida_id, ");
			sql.append("            MOTIVOCANCELACION_ID, ");
			if (agruparPorDia) {
				sql.append("            TO_CHAR(fechorventa, 'dd/MM/yyyy') fechorventa ");
			} else if (agruparPorMes) {
				sql.append("            TO_CHAR(fechorventa, 'MM/yyyy') fechorventa ");
			} else if (agruparPorAno) {
				sql.append("            TO_CHAR(fechorventa, 'yyyy') fechorventa ");
			}
			sql.append("        FROM boleto ");
			sql.append(" WHERE empresacorrida_id IN (").append(empresaId).append(") ");
			sql.append("    AND INDSTATUSBOLETO <> 'C' ");
			sql.append("    )ca ");
			sql.append(" INNER JOIN corrida c ON (c.corrida_id = ca.corrida_id AND c.feccorrida = ca.feccorrida) ");
			sql.append(" INNER JOIN empresa e ON e.empresa_id = c.empresacorrida_id ");
			sql.append(" INNER JOIN ruta r ON r.ruta_id = c.ruta_id ");
			sql.append(" INNER JOIN parada o ON o.parada_id = ca.origen_id ");
			sql.append(" INNER JOIN parada d ON d.parada_id = ca.destino_id ");
			break;
		case EXCESSO_BAGAGEM:
			sql.append(" FROM ");
			sql.append("    (  SELECT ");
			sql.append("            eventoextra_id, ");
			sql.append("            MOTIVOCANCELACION_ID, ");
			if (agruparPorDia) {
				sql.append("            TO_CHAR(FECHORVTA, 'dd/MM/yyyy') fechorventa ");
			} else if (agruparPorMes) {
				sql.append("            TO_CHAR(FECHORVTA, 'MM/yyyy') fechorventa ");
			} else if (agruparPorAno) {
				sql.append("            TO_CHAR(FECHORVTA, 'yyyy') fechorventa ");
			}
			sql.append("        FROM caja_diversos)ca ");
			sql.append("       INNER JOIN evento_extra ex ON ex.eventoextra_id = ca.eventoextra_id ");
			sql.append("       INNER JOIN corrida c ON ( c.corrida_id = ex.corrida_id AND c.feccorrida = ex.feccorrida ) ");
			sql.append("       INNER JOIN empresa e ON e.empresa_id = c.empresacorrida_id ");
			sql.append("       INNER JOIN ruta r ON r.ruta_id = c.ruta_id ");
			sql.append("       INNER JOIN parada o ON o.parada_id = c.origen_id ");
			sql.append("       INNER JOIN parada d ON d.parada_id = c.destino_id ");
			break;
		}

		sql.append(" WHERE 1 = 1 ");
		if (!linhasIds.equals("0")) {
			sql.append("    AND c.ruta_id IN (").append(linhasIds).append(") ");
		}

		if (desconsiderarBilhetesDevolvidos) {
			sql.append("    AND ca.MOTIVOCANCELACION_ID IS NULL ");
		}
		
		sql.append(" AND c.feccorrida BETWEEN To_date('").append(dataDe).append("', 'dd/mm/yyyy HH24:mi:ss') ");
		sql.append("                      AND To_date('").append(dataAte).append("', 'dd/mm/yyyy HH24:mi:ss') ");

		sql.append("GROUP BY ca.fechorventa, c.corrida_id, c.feccorrida, r.NUMRUTA, r.PREFIXO, c.fechorsalida, r.descruta, o.descparada, d.descparada, e.empresa_id, e.nombempresa ");
		sql.append("ORDER BY c.feccorrida, e.nombempresa ASC ");

		return sql.toString();
	}
}
