/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.web.gui.controladores.tarifas;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.util.media.Media;
import org.zkoss.util.resource.Labels;
import org.zkoss.zhtml.Filedownload;
import org.zkoss.zhtml.Fileupload;
import org.zkoss.zhtml.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.Moneda;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.TarifaEmbarcada;
import com.rjconsultores.ventaboletos.entidad.TipoPuntoVenta;
import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa;
import com.rjconsultores.ventaboletos.service.CategoriaService;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.MarcaService;
import com.rjconsultores.ventaboletos.service.MonedaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.RutaCombinacionService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.TarifaEmbarcadaService;
import com.rjconsultores.ventaboletos.service.TipoPuntoVentaService;
import com.rjconsultores.ventaboletos.service.VigenciaTarifaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderCatalogoDeRutas;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderClaseServicio;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderEmpresaModificacionMassivaEmbarcada;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderMarca;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderMoneda;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderOrgaoConcedenteModifMassEmb;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderPersonalizado;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderTipoPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderVigenciaTarifaModificacionMassivaEmbarcada;


@Controller("modificacionMasivaEmbarcadaController")
@Scope("prototype")
public class ModificacionMasivaEmbarcadaController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private final Integer CELL_ID_TARIFA = 0;
	@Autowired
	private TarifaEmbarcadaService tarifaEmbarcadaService;
	@Autowired
	private RutaCombinacionService rutaCombinacionService;
	@Autowired
	private MarcaService marcaService;
	@Autowired
	private ClaseServicioService claseServicioService;
	@Autowired
	private MonedaService monedaService;
	@Autowired
	private RutaService rutaService;
	@Autowired
	private TipoPuntoVentaService tipoPuntoVentaService;
	@Autowired
	private CategoriaService categoriaService;
	@Autowired
	private VigenciaTarifaService vigenciaTarifaService;
	@Autowired
	private OrgaoConcedenteService orgaoConcedenteService;
	private List<Marca> lsMarcas;
	private List<ClaseServicio> lsClaseServico;
	private List<Moneda> lsMonedas;
	private List<Empresa> lsEmpresas;
	private List<Ruta> lsRutas;
	private List<OrgaoConcedente> lsOrgaoConcedente;
	private List<TipoPuntoVenta> lsTipoPuntoVenta;
	private List<Categoria> lsCategoria;
	private List<VigenciaTarifa> lsVigenciaTarifa;
	private List<Marca> lsAddRmvMarcas;
	private List<ClaseServicio> lsAddRmvClaseServico;
	private List<Moneda> lsAddRmvMonedas;
	private List<Empresa> lsAddRmvEmpresas;
	private List<Ruta> lsAddRmvRutas;
	private List<OrgaoConcedente> lsAddRmvOrgaoConcedente;
	private List<TipoPuntoVenta> lsAddRmvTipoPuntoVenta;
	private List<Categoria> lsAddRmvCategoria;
	private List<VigenciaTarifa> lsAddRmvVigenciaTarifa;
	private List<String> lsComponentePreco;
	
	private Combobox cmbMarca;
	private Combobox cmbMoneda;
	private Combobox cmbClaseServicio;
	private Combobox cmbEmpresa;
	private Combobox cmbRuta;
	private Combobox cmbOrgaoConcedente;
	private Combobox cmbTipoPuntoVenta;
	private Combobox cmbCategoria;
	private Combobox cmbVigenciaTarifaEmb;
	private Combobox cmbComponentePreco;
	private MyListbox claseServicioList;
	private MyListbox marcaList;
	private MyListbox monedaList;
	private MyListbox empresaList;
	private MyListbox rutaList;
	private MyListbox orgaoConcedenteList;
	private MyListbox tipoPuntoVentaList;
	private MyListbox categoriaList;
	private MyListbox vigenciaTarifaEmbList;
	private Textbox txtPorcentagem;
	private Radio radIncremento;
	private Radio radAgrupamentoLinhasSim;
	private Button btnGerarTarifasEmb;
	private Tab tabTipoPuntoVenta;
	private Tab tabCategoria;
	
	private final int ROW_CABECALHO = 0;
	
	//INDICES PLANILHA
	private final int IDX_CELL_ID = 0;
	private final int IDX_CELL_MARCA = 1;
	private final int IDX_CELL_NUMLINHA = 2;
	private final int IDX_CELL_DESCLINHA = 3;
	private final int IDX_CELL_TIPOCLASSE = 4;
	private final int IDX_CELL_TRECHO = 5;
	private final int IDX_CELL_ORIGEM = 6;
	private final int IDX_CELL_DESTINO = 7;
	private final int IDX_CELL_TARIFAORIGINAL = 8;
	private final int IDX_CELL_TARIFAATUAL = 9;
	private final int IDX_CELL_TARIFA_SIMULADA = 10;
	private final int IDX_CELL_PEDAGIOATUAL = 11;
	private final int IDX_CELL_PEDAGIOSIMULADO = 12;
	private final int IDX_CELL_TXEMBARQUEATUAL = 13;
	private final int IDX_CELL_TXEMBARQUESIMULADO = 14;
	private final int IDX_CELL_SEGUROATUAL = 15;
	private final int IDX_CELL_SEGUROSIMULADO = 16;
	private final int IDX_CELL_TPPATUAL = 17;
	private final int IDX_CELL_TPPSIMULADO = 18;
	private final int IDX_CELL_ORGAOCONCEDENTE = 19;
	private final int IDX_CELL_PREFIXO = 20;
	private final int IDX_CELL_VIGENCIA = 21;
	private final int IDX_CELL_MOEDA = 22;
	private final int IDX_CELL_SENTIDO = 23;
	private final int IDX_CELL_VENDE = 24;
	private final int IDX_CELL_CHAVEPORDEMANDA = 25;
	
	private static Logger log = LogManager.getLogger(ModificacionMasivaEmbarcadaController.class);

	public List<ClaseServicio> getLsClaseServico() {
		return lsClaseServico;
	}

	public void setLsClaseServico(List<ClaseServicio> lsClaseServico) {
		this.lsClaseServico = lsClaseServico;
	}

	public List<Marca> getLsMarcas() {
		return lsMarcas;
	}

	public void setLsMarcas(List<Marca> lsMarcas) {
		this.lsMarcas = lsMarcas;
	}

	public List<Moneda> getLsMonedas() {
		return lsMonedas;
	}

	public void setLsMonedas(List<Moneda> lsMonedas) {
		this.lsMonedas = lsMonedas;
	}

	public List<Empresa> getLsEmpresas() {
		return lsEmpresas;
	}

	public void setLsEmpresas(List<Empresa> lsEmpresas) {
		this.lsEmpresas = lsEmpresas;
	}

	public List<Ruta> getLsRutas() {
		return lsRutas;
	}

	public void setLsRutas(List<Ruta> lsRutas) {
		this.lsRutas = lsRutas;
	}

	public List<Categoria> getLsCategoria() {
		return lsCategoria;
	}

	public void setLsCategoria(List<Categoria> lsCategoria) {
		this.lsCategoria = lsCategoria;
	}

	public List<TipoPuntoVenta> getLsTipoPuntoVenta() {
		return lsTipoPuntoVenta;
	}

	public void setLsTipoPuntoVenta(List<TipoPuntoVenta> lsTipoPuntoVenta) {
		this.lsTipoPuntoVenta = lsTipoPuntoVenta;
	}

	public List<VigenciaTarifa> getLsVigenciaTarifa() {
		return lsVigenciaTarifa;
	}

	public void setLsVigenciaTarifa(List<VigenciaTarifa> lsVigenciaTarifa) {
		this.lsVigenciaTarifa = lsVigenciaTarifa;
	}
	
	public List<String> getLsComponentePreco() {
		return lsComponentePreco;
	}

	public void setLstComponentePreco(List<String> lsComponentePreco) {
		this.lsComponentePreco = lsComponentePreco;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {

		super.doAfterCompose(comp);
		
		
		lsOrgaoConcedente = orgaoConcedenteService.obtenerTodos();
		lsMarcas = marcaService.buscarMarcaPorEmpresa(UsuarioLogado.getUsuarioLogado().getEmpresa());
		lsClaseServico = claseServicioService.obtenerTodos();
		lsMonedas = monedaService.obtenerTodos();
		lsEmpresas = UsuarioLogado.getUsuarioLogado().getEmpresa();
		lsRutas = rutaService.buscarRutasPorEmpresas(lsEmpresas);
		lsTipoPuntoVenta = tipoPuntoVentaService.obtenerTodos();
		lsCategoria = categoriaService.obtenerTodos();
		lsVigenciaTarifa = vigenciaTarifaService.obtenerTodos();
		
		setLstComponentePreco(EnumTarifaPedagio.obterBundleValues());

		claseServicioList.setItemRenderer(new RenderClaseServicio());
		marcaList.setItemRenderer(new RenderMarca());
		monedaList.setItemRenderer(new RenderMoneda());
		empresaList.setItemRenderer(new RenderEmpresaModificacionMassivaEmbarcada());
		rutaList.setItemRenderer(new RenderCatalogoDeRutas());
		orgaoConcedenteList.setItemRenderer(new RenderOrgaoConcedenteModifMassEmb());
		tipoPuntoVentaList.setItemRenderer(new RenderTipoPuntoVenta());
		categoriaList.setItemRenderer(new RenderPersonalizado<Categoria>(Arrays.asList("categoriaId", "desccategoria")));
		vigenciaTarifaEmbList.setItemRenderer(new RenderVigenciaTarifaModificacionMassivaEmbarcada());
		

		lsAddRmvMarcas = new ArrayList<Marca>();
		lsAddRmvClaseServico = new ArrayList<ClaseServicio>();
		lsAddRmvMonedas = new ArrayList<Moneda>();
		lsAddRmvEmpresas = new ArrayList<Empresa>();
		lsAddRmvRutas = new ArrayList<Ruta>();
		lsAddRmvOrgaoConcedente = new ArrayList<OrgaoConcedente>();
		lsAddRmvTipoPuntoVenta = new ArrayList<TipoPuntoVenta>();
		lsAddRmvCategoria = new ArrayList<Categoria>();
		lsAddRmvVigenciaTarifa = new ArrayList<VigenciaTarifa>();
		
		// eliminando a opcao TODOS de tipo servicio:
		CollectionUtils.filter(lsClaseServico, new Predicate() {

			@Override
			public boolean evaluate(Object obj) {
				return !(((ClaseServicio) obj).getClaseservicioId().equals(ClaseServicio.TODOS));
			}
		});

		// eliminando a opcao TODOS da marca:
		CollectionUtils.filter(lsMarcas, new Predicate() {

			@Override
			public boolean evaluate(Object obj) {
				return !(((Marca) obj).getMarcaId().equals(Marca.TODOS));
			}
		});

		// Exibir botão para gerar tarifas automaticas
		//btnGerarTarifas.setVisible(ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.GENERAR_TARIFAS_AUTOMATICA.getDescricao()));
		btnGerarTarifasEmb.setVisible(false);
		
		// Abas desativadas no SCIA
		tabCategoria.setVisible(Boolean.FALSE);
		tabTipoPuntoVenta.setVisible(Boolean.FALSE);
	}

	public void onClick$btnGerarExcel(Event ev) {
		onClick$btnGerarExcelLinear(null);
	}

	public void onClick$btnGerarExcelLinear(Event ev) {

		try {
			if (lsAddRmvVigenciaTarifa.isEmpty()) {
				Messagebox.show(
						Labels.getLabel("modificacionMasivaEmbarcadaController.MSG.SemVigencia"),
						Labels.getLabel("modificacionMasivaEmbarcadaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);

				return;
			}

			BigDecimal coeficiente = new BigDecimal(BigInteger.ZERO);
			try {
				if (txtPorcentagem.getValue() != null) {

					BigDecimal porcentage = BigDecimal.valueOf(Double.parseDouble(txtPorcentagem.getValue().replace(",", ".")));

					coeficiente = porcentage.divide(new BigDecimal(100));
					if (radIncremento.isChecked()) {
						coeficiente = coeficiente.add(BigDecimal.ONE);
					} else {
						coeficiente = BigDecimal.ONE.subtract(coeficiente);
					}
				}
			} catch (Exception e) {
				log.error("", e);
				log.debug("Porcentagem Zero");
			}

			if (coeficiente == null) {
				return;
			}

			//Estilo padrão para os dois tipos de relatórios
			SXSSFWorkbook  wb = new SXSSFWorkbook ();

			// fonte em negrito:
			Font fonte = wb.createFont();
			fonte.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
			CellStyle estilo = wb.createCellStyle();
			estilo.setFont(fonte);

			List<Object> lsRutaCombinacion = rutaCombinacionService.pesquisaTarifaEmbObj(lsAddRmvMonedas, lsAddRmvMarcas,
					lsAddRmvClaseServico, lsAddRmvCategoria, lsAddRmvEmpresas, lsAddRmvRutas,
					lsAddRmvTipoPuntoVenta, lsAddRmvVigenciaTarifa, lsAddRmvOrgaoConcedente);

			if (!lsRutaCombinacion.isEmpty()) {
				if (radAgrupamentoLinhasSim.isChecked()){
					gerarExcelComAgrupamento(lsRutaCombinacion, wb, estilo, coeficiente);
				} else {
					gerarExcelSemAgrupamento(lsRutaCombinacion, wb, estilo, coeficiente);
				}
				
				String nomeArquivo =
						UsuarioLogado.getUsuarioLogado().getNombusuario()
								+ "_" + Calendar.getInstance().getTime().getTime()
								+ "_" + "modMassivaT";

				File fNomeArquivo = File.createTempFile(nomeArquivo, ".tmp");

				FileOutputStream stream = new FileOutputStream(fNomeArquivo);
				stream.flush();
				wb.write(stream);
				stream.close();

				InputStream is = null;
				is = new FileInputStream(fNomeArquivo);
				Filedownload.save(is, "application/xls", "modificacionMasivaTarifaEmbarcada.xls");

				fNomeArquivo.delete();

			} else {
				Messagebox.show(Labels.getLabel("modificacionMasivaEmbarcadaUploadController.MSG.excelVazio"),
						Labels.getLabel("modificacionMasivaEmbarcadaController.window.title"), Messagebox.OK, Messagebox.INFORMATION);
			}

		} catch (Exception ex) {
			log.error("", ex);
		}
	}

	private String getStringImporteSafe(Object o) {
		return ((o == null)?"0.0":o.toString());
	}

	// Escala
	public VigenciaTarifa vigenciaTarifa(Media mExcel) throws IOException {
		InputStream isMExcel = mExcel.getStreamData();
		Workbook wb = new XSSFWorkbook(isMExcel);

		VigenciaTarifa v = new VigenciaTarifa();

		for (int k = 0; k < wb.getNumberOfSheets(); k++) {
			Sheet sheet = wb.getSheetAt(k);
			int rows = sheet.getPhysicalNumberOfRows();

			// pula o row 0 pq eh o cabecalho:
			for (int r = 1; r < rows; r++) {
				Row row = sheet.getRow(r);
				if (row == null) {
					continue;
				}

				Cell cellIdTarifa = row.getCell(CELL_ID_TARIFA);
				BigDecimal bdId = new BigDecimal(cellIdTarifa.getNumericCellValue());
				Integer idTarifa = bdId.intValue();

				TarifaEmbarcada tarifaEmbarcada = tarifaEmbarcadaService.obtenerID(idTarifa);

				v = tarifaEmbarcada.getVigenciaTarifa();

				break;
			}
		}

		return v;
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public void onClick$btnUpLoadExcel(Event ev) throws InterruptedException, IOException {
		Media mExcel = Fileupload.get();

		if (mExcel != null) {
			Map args = new HashMap();
			args.put("mExcel", mExcel);

			openWindow("/gui/tarifas/modificacionMasivaEmbarcadaUpload.zul",
					Labels.getLabel("modificacionMasivaEmbarcadaController.window.title"), args, MODAL);
		}
	}

	public void onClick$btnAdicionarClaseServicio(Event ev) {
		Comboitem cbiClaseServicio = cmbClaseServicio.getSelectedItem();
		if (cbiClaseServicio != null) {
			ClaseServicio claseServicio = (ClaseServicio) cbiClaseServicio.getValue();

			lsAddRmvClaseServico.add(claseServicio);
			claseServicioList.setData(lsAddRmvClaseServico);

			cmbClaseServicio.setSelectedItem(null);
		}
	}

	public void onClick$btnRemoverClaseServicio(Event ev) {
		ClaseServicio claseServicio = (ClaseServicio) claseServicioList.getSelected();
		if (claseServicio != null) {
			lsAddRmvClaseServico.remove(claseServicio);
			claseServicioList.setData(lsAddRmvClaseServico);
		}
	}

	public void onClick$btnAdicionarMarca(Event ev) {
		Comboitem cbimarca = cmbMarca.getSelectedItem();
		if (cbimarca != null) {
			Marca marca = (Marca) cbimarca.getValue();

			lsAddRmvMarcas.add(marca);
			marcaList.setData(lsAddRmvMarcas);

			cmbMarca.setSelectedItem(null);
		}
	}

	public void onClick$btnRemoverMarca(Event ev) {
		Marca marca = (Marca) marcaList.getSelected();
		if (marca != null) {
			lsAddRmvMarcas.remove(marca);
			marcaList.setData(lsAddRmvMarcas);
		}
	}

	public void onClick$btnAdicionarMoneda(Event ev) {
		Comboitem cbiMoneda = cmbMoneda.getSelectedItem();
		if (cbiMoneda != null) {
			Moneda moneda = (Moneda) cbiMoneda.getValue();

			lsAddRmvMonedas.add(moneda);
			monedaList.setData(lsAddRmvMonedas);

			cmbMoneda.setSelectedItem(null);
		}
	}

	public void onClick$btnRemoverMoneda(Event ev) {
		Moneda moneda = (Moneda) monedaList.getSelected();
		if (moneda != null) {
			lsAddRmvMonedas.remove(moneda);
			monedaList.setData(lsAddRmvMonedas);
		}
	}

	public void onClick$btnAdicionarEmpresa(Event ev) {
		Comboitem cbiEmpresa = cmbEmpresa.getSelectedItem();
		if (cbiEmpresa != null) {
			Empresa empresa = (Empresa) cbiEmpresa.getValue();

			lsAddRmvEmpresas.add(empresa);
			empresaList.setData(lsAddRmvEmpresas);

			cmbEmpresa.setSelectedItem(null);
		}
	}

	public void onClick$btnRemoverEmpresa(Event ev) {
		Empresa empresa = (Empresa) empresaList.getSelected();
		if (empresa != null) {
			lsAddRmvEmpresas.remove(empresa);
			empresaList.setData(lsAddRmvEmpresas);
		}
	}

	public void onClick$btnAdicionarRuta(Event ev) {
		Comboitem cbiRuta = cmbRuta.getSelectedItem();
		if (cbiRuta != null) {
			Ruta ruta = (Ruta) cbiRuta.getValue();

			lsAddRmvRutas.add(ruta);
			rutaList.setData(lsAddRmvRutas);

			cmbRuta.setSelectedItem(null);
		}
	}

	public void onClick$btnRemoverRuta(Event ev) {
		Ruta ruta = (Ruta) rutaList.getSelected();
		if (ruta != null) {
			lsAddRmvRutas.remove(ruta);
			rutaList.setData(lsAddRmvRutas);
		}
	}
	
	public void onClick$btnAdicionarOrgao(Event ev) {
		Comboitem cbiOrgao = cmbOrgaoConcedente.getSelectedItem();
		if (cbiOrgao != null) {
			OrgaoConcedente orgao = (OrgaoConcedente) cbiOrgao.getValue();

			lsAddRmvOrgaoConcedente.add(orgao);
			orgaoConcedenteList.setData(lsAddRmvOrgaoConcedente);

			cmbOrgaoConcedente.setSelectedItem(null);
		}
	}

	public void onClick$btnRemoverOrgao(Event ev) {
		OrgaoConcedente orgao = (OrgaoConcedente) orgaoConcedenteList.getSelected();
		if (orgao != null) {
			lsAddRmvOrgaoConcedente.remove(orgao);
			orgaoConcedenteList.setData(lsAddRmvOrgaoConcedente);
		}
	}

	public void onClick$btnAdicionarTipoPuntoVenta(Event ev) {
		Comboitem cbiTipoPuntoVenta = cmbTipoPuntoVenta.getSelectedItem();
		if (cbiTipoPuntoVenta != null) {
			TipoPuntoVenta tipoPuntoVenta = (TipoPuntoVenta) cbiTipoPuntoVenta.getValue();

			lsAddRmvTipoPuntoVenta.add(tipoPuntoVenta);
			tipoPuntoVentaList.setData(lsAddRmvTipoPuntoVenta);

			cmbTipoPuntoVenta.setSelectedItem(null);
		}
	}

	public void onClick$btnRemoverTipoPuntoVenta(Event ev) {
		TipoPuntoVenta tipoPuntoVenta = (TipoPuntoVenta) tipoPuntoVentaList.getSelected();
		if (tipoPuntoVenta != null) {
			lsAddRmvTipoPuntoVenta.remove(tipoPuntoVenta);
			tipoPuntoVentaList.setData(lsAddRmvTipoPuntoVenta);
		}
	}

	public void onClick$btnAdicionarCategoria(Event ev) {
		Comboitem cbiCategoria = cmbCategoria.getSelectedItem();
		if (cbiCategoria != null) {
			Categoria categoria = (Categoria) cbiCategoria.getValue();

			lsAddRmvCategoria.add(categoria);
			categoriaList.setData(lsAddRmvCategoria);

			cmbCategoria.setSelectedItem(null);
		}
	}

	public void onClick$btnRemoverCategoria(Event ev) {
		Categoria categoria = (Categoria) categoriaList.getSelected();
		if (categoria != null) {
			lsAddRmvCategoria.remove(categoria);
			categoriaList.setData(lsAddRmvCategoria);
		}
	}

	public void onClick$btnAdicionarVigenciaTarifaEmb(Event ev) throws InterruptedException {
		Comboitem cbiVigenciaTarifa = cmbVigenciaTarifaEmb.getSelectedItem();
		
		if (lsAddRmvVigenciaTarifa.size() > 0 ){
			Messagebox.show(Labels.getLabel("modificacionMasivaEmbarcadaUploadController.MSG.nomaximoumavigencia"),
					Labels.getLabel("modificacionMasivaEmbarcadaController.window.title"), Messagebox.OK, Messagebox.INFORMATION);
			
			return;
		}
		
		if (cbiVigenciaTarifa != null) {
			VigenciaTarifa vigenciaTarifa = (VigenciaTarifa) cbiVigenciaTarifa.getValue();

			lsAddRmvVigenciaTarifa.add(vigenciaTarifa);
			vigenciaTarifaEmbList.setData(lsAddRmvVigenciaTarifa);

			cmbVigenciaTarifaEmb.setSelectedItem(null);
		}
	}

	public void onClick$btnRemoverVigenciaTarifaEmb(Event ev) {
		VigenciaTarifa vigenciaTarifa = (VigenciaTarifa) vigenciaTarifaEmbList.getSelected();
		if (vigenciaTarifa != null) {
			lsAddRmvVigenciaTarifa.remove(vigenciaTarifa);
			vigenciaTarifaEmbList.setData(lsAddRmvVigenciaTarifa);
		}
	}

	public List<OrgaoConcedente> getLsOrgaoConcedente() {
		return lsOrgaoConcedente;
	}

	public void setLsOrgaoConcedente(List<OrgaoConcedente> lsOrgaoConcedente) {
		this.lsOrgaoConcedente = lsOrgaoConcedente;
	}
	
	private void gerarExcelSemAgrupamento(List<Object> lsRutaCombinacion, SXSSFWorkbook wb,  CellStyle estilo, BigDecimal coeficiente){
		SXSSFSheet  sheet1 = null;
		String ruta = "";
		int contRow = 0;
		
		for (int i = 0; i < lsRutaCombinacion.size(); i++) {
			Object[] obj = (Object[]) lsRutaCombinacion.get(i);

			String sheetName = "";
			
			try{
				if (!ruta.equals(obj[4].toString().concat(obj[12].toString()))) {
					
					ruta = obj[4].toString().concat(obj[12].toString());
					String sentido = (obj[22].toString().equals("1"))?"IDA":"VOLTA";
					
					if (obj[4].toString().length() > 26) {
						sheetName = (obj[12].toString().concat("-").concat(obj[4].toString().substring(0, obj[4].toString().length()).concat(" - ").concat(sentido)));
					} else {
						sheetName = (obj[12].toString().concat("-").concat(obj[4].toString()).concat(" - ").concat(sentido));
					}
					sheetName = sheetName.replaceAll("/", "-");
					
					log.debug("Aba: " + sheetName);
					sheet1 = (SXSSFSheet) wb.createSheet(sheetName);
					contRow = 1;
					
					criarCabecalhoExcel(sheet1, estilo);
				}				
			} catch(Exception exception){
				log.error("",exception);
				System.err.println(sheetName);
				continue;
			}
			
			
			popularPlanilha(sheet1, obj, estilo, coeficiente, contRow++);
		}
	}
	
	private void gerarExcelComAgrupamento(List<Object> lsRutaCombinacion, SXSSFWorkbook wb, CellStyle estilo, BigDecimal coeficiente) {
		
		SXSSFSheet sheet1 = null;
		String ruta = "";
		int contRow = 0;
		
		for (int i = 0; i < lsRutaCombinacion.size(); i++) {
			
			Object[] obj = (Object[]) lsRutaCombinacion.get(i);

			if (!ruta.equals(obj[4].toString().concat(obj[12].toString()))) {
				
				ruta = obj[4].toString().concat(obj[12].toString());
				String linha = "";
				if (obj[4].toString().length() > 26) {
					linha = (obj[12].toString().concat("-").concat(obj[4].toString().substring(0, 26)));
				} else {
					linha = (obj[12].toString().concat("-").concat(obj[4].toString()));
				}
				linha = "Linha: ".concat(linha.replaceAll("/", "-"));
				log.debug("Linha: " + linha);

				if (sheet1 == null){
					sheet1 = (SXSSFSheet) wb.createSheet("Agrupado por Linha");
					contRow = 0;
				}
				
				if (contRow == 0){
					criarCabecalhoExcel(sheet1, estilo);
					++contRow;
				}
			}
			
			popularPlanilha(sheet1, obj, estilo, coeficiente, contRow++);
		}
	}
	
	private boolean validarComponente(Object[] obj, int rowNum) {
		if (obj[rowNum] == null) {
			return false;
		}

		return true;
	}
	
	private void criarCabecalhoExcel(SXSSFSheet sheet1, CellStyle estilo) {
		
		Row rowCabecalho = sheet1.createRow(ROW_CABECALHO);
		
		Cell cellId = rowCabecalho.createCell(IDX_CELL_ID);
		cellId.setCellValue(Labels.getLabel("busquedaTarifaController.lhId.label"));
		cellId.setCellStyle(estilo);

		Cell cellMarca = rowCabecalho.createCell(IDX_CELL_MARCA);
		cellMarca.setCellValue(Labels.getLabel("busquedaTarifaController.lhMarca.label"));
		cellMarca.setCellStyle(estilo);

		Cell cellNumLinha = rowCabecalho.createCell(IDX_CELL_NUMLINHA);
		cellNumLinha.setCellValue(Labels.getLabel("busquedaTarifaController.lhNumLinha.label"));
		cellNumLinha.setCellStyle(estilo);

		Cell cellDescLinha = rowCabecalho.createCell(IDX_CELL_DESCLINHA);
		cellDescLinha.setCellValue(Labels.getLabel("busquedaTarifaController.lhDescLinha.label"));
		cellDescLinha.setCellStyle(estilo);

		Cell cellTipoClasse = rowCabecalho.createCell(IDX_CELL_TIPOCLASSE);
		cellTipoClasse.setCellValue(Labels.getLabel("busquedaTarifaController.lhClaseServicio.label"));
		cellTipoClasse.setCellStyle(estilo);

		Cell cellTrecho = rowCabecalho.createCell(IDX_CELL_TRECHO);
		cellTrecho.setCellValue(Labels.getLabel("busquedaTarifaController.lhTramo.label"));
		cellTrecho.setCellStyle(estilo);

		Cell cellOrigem = rowCabecalho.createCell(IDX_CELL_ORIGEM);
		cellOrigem.setCellValue(Labels.getLabel("busquedaTarifaController.lhOrigen.label"));
		cellOrigem.setCellStyle(estilo);

		Cell cellDestino = rowCabecalho.createCell(IDX_CELL_DESTINO);
		cellDestino.setCellValue(Labels.getLabel("busquedaTarifaController.lhDestino.label"));
		cellDestino.setCellStyle(estilo);

		Cell cellTarifaOriginal = rowCabecalho.createCell(IDX_CELL_TARIFAORIGINAL);
		cellTarifaOriginal.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioOriginal.label"));
		cellTarifaOriginal.setCellStyle(estilo);

		Cell cellTarifaAtual = rowCabecalho.createCell(IDX_CELL_TARIFAATUAL);
		cellTarifaAtual.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioExcel.label"));
		cellTarifaAtual.setCellStyle(estilo);

		Cell cellTarifaSimulada = rowCabecalho.createCell(IDX_CELL_TARIFA_SIMULADA);
		cellTarifaSimulada.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioNuevo.label"));
		cellTarifaSimulada.setCellStyle(estilo);

		Cell cellPedagioAtual = rowCabecalho.createCell(IDX_CELL_PEDAGIOATUAL);
		cellPedagioAtual.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioPedagio.label"));
		cellPedagioAtual.setCellStyle(estilo);

		Cell cellPedagioSimulado = rowCabecalho.createCell(IDX_CELL_PEDAGIOSIMULADO);
		cellPedagioSimulado.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioPedagioNuevo.label"));
		cellPedagioSimulado.setCellStyle(estilo);

		Cell cellTxEmbarqueAtual = rowCabecalho.createCell(IDX_CELL_TXEMBARQUEATUAL);
		cellTxEmbarqueAtual.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioTxEmbarque.label"));
		cellTxEmbarqueAtual.setCellStyle(estilo);

		Cell cellTxEmbarqueSimulado = rowCabecalho.createCell(IDX_CELL_TXEMBARQUESIMULADO);
		cellTxEmbarqueSimulado.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioTxEmbarqueSimulado.label"));
		cellTxEmbarqueSimulado.setCellStyle(estilo);

		Cell cellSeguroAtual = rowCabecalho.createCell(IDX_CELL_SEGUROATUAL);
		cellSeguroAtual.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioSeguroAtual.label"));
		cellSeguroAtual.setCellStyle(estilo);

		Cell cellSeguroSimulado = rowCabecalho.createCell(IDX_CELL_SEGUROSIMULADO);
		cellSeguroSimulado.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioSeguroSimulado.label"));
		cellSeguroSimulado.setCellStyle(estilo);
		
		Cell cellTPPAtual = rowCabecalho.createCell(IDX_CELL_TPPATUAL);
		cellTPPAtual.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioTPPAtual.label"));
		cellTPPAtual.setCellStyle(estilo);
		
		Cell cellTPPSimulado = rowCabecalho.createCell(IDX_CELL_TPPSIMULADO);
		cellTPPSimulado.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioTPPSimulado.label"));
		cellTPPSimulado.setCellStyle(estilo);

		Cell cellOrgaoConcedente = rowCabecalho.createCell(IDX_CELL_ORGAOCONCEDENTE);
		cellOrgaoConcedente.setCellValue(Labels.getLabel("busquedaTarifaController.lhOrgaoLabel.label"));
		cellOrgaoConcedente.setCellStyle(estilo);

		Cell cellPrefixo = rowCabecalho.createCell(IDX_CELL_PREFIXO);
		cellPrefixo.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrefixo.label"));
		cellPrefixo.setCellStyle(estilo);

		Cell cellVigencia = rowCabecalho.createCell(IDX_CELL_VIGENCIA);
		cellVigencia.setCellValue(Labels.getLabel("busquedaTarifaController.lhFeciniciovigencia.label"));
		cellVigencia.setCellStyle(estilo);

		Cell cellMoeda = rowCabecalho.createCell(IDX_CELL_MOEDA);
		cellMoeda.setCellValue(Labels.getLabel("busquedaTarifaController.lhMoneda.label"));
		cellMoeda.setCellStyle(estilo);
		
		Cell cellSentido = rowCabecalho.createCell(IDX_CELL_SENTIDO);
		cellSentido.setCellValue(Labels.getLabel("busquedaTarifaController.lhSentido.label"));
		cellSentido.setCellStyle(estilo);
		
		Cell cellVende = rowCabecalho.createCell(IDX_CELL_VENDE);
		cellVende.setCellValue(Labels.getLabel("busquedaTarifaController.lhVende.label"));
		cellVende.setCellStyle(estilo);
		
		Cell cellChavePorDemanda = rowCabecalho.createCell(IDX_CELL_CHAVEPORDEMANDA);
		cellChavePorDemanda.setCellValue(Labels.getLabel("busquedaTarifaController.lhChavePorDemanda.label"));
		cellChavePorDemanda.setCellStyle(estilo);
	}
	
	private boolean popularPlanilha(SXSSFSheet sheet1,Object[] obj, CellStyle estilo, BigDecimal coeficiente, int rowNum){
		SXSSFRow row = (SXSSFRow) sheet1.createRow(rowNum);

		//IDXs das coluna diferente dos IDXs do obj
		row.createCell(IDX_CELL_ID).setCellValue(Integer.parseInt(obj[0].toString()));
		row.createCell(IDX_CELL_TRECHO).setCellValue(obj[1].toString());
		row.createCell(IDX_CELL_ORIGEM).setCellValue(obj[2].toString());
		row.createCell(IDX_CELL_DESTINO).setCellValue(obj[3].toString());
		row.createCell(IDX_CELL_DESCLINHA).setCellValue(obj[4].toString().concat(" (").concat(obj[12].toString()).concat(")"));
		row.createCell(IDX_CELL_MARCA).setCellValue(obj[5].toString());
		row.createCell(IDX_CELL_TIPOCLASSE).setCellValue(obj[6].toString());

		DateFormat sfFormatada = new SimpleDateFormat("dd/MM/yyyy");

		Date dataIni = (Date) obj[7];
		Date dataFim = (Date) obj[8];

		row.createCell(IDX_CELL_VIGENCIA).setCellValue(sfFormatada.format(dataIni) + " - " + sfFormatada.format(dataFim));
		row.createCell(IDX_CELL_MOEDA).setCellValue(obj[9].toString());

		String ori = getStringImporteSafe(obj[10]);
		BigDecimal original = BigDecimal.valueOf(Double.valueOf(ori));

		String atu = getStringImporteSafe(obj[11]);
		BigDecimal atual = BigDecimal.valueOf(Double.valueOf(atu));

		row.createCell(IDX_CELL_TARIFAORIGINAL).setCellValue(original.setScale(2).doubleValue());
		row.createCell(IDX_CELL_TARIFAATUAL).setCellValue(atual.setScale(2).doubleValue());

		String ped = getStringImporteSafe(obj[16]);
		BigDecimal pedVal = BigDecimal.valueOf(Double.valueOf(ped));
		row.createCell(IDX_CELL_PEDAGIOATUAL).setCellValue(pedVal.setScale(2).doubleValue());
		
		String txEmbarque = getStringImporteSafe(obj[18]);
		BigDecimal txEmbarqueVal = BigDecimal.valueOf(Double.valueOf(txEmbarque));
		row.createCell(IDX_CELL_TXEMBARQUEATUAL).setCellValue(txEmbarqueVal.setScale(2).doubleValue());	
		
		String seguro = getStringImporteSafe(obj[19]);
		BigDecimal seguroVal = BigDecimal.valueOf(Double.valueOf(seguro));
		row.createCell(IDX_CELL_SEGUROATUAL).setCellValue(seguroVal.setScale(2).doubleValue());		
		
		String tpp = getStringImporteSafe(obj[20]);
		BigDecimal tppVal = BigDecimal.valueOf(Double.valueOf(tpp));
		row.createCell(IDX_CELL_TPPATUAL).setCellValue(tppVal.setScale(2).doubleValue());	
		
		row.createCell(IDX_CELL_ORGAOCONCEDENTE).setCellValue(obj[17].toString());
		
		row.createCell(IDX_CELL_NUMLINHA).setCellValue(obj[21] == null?"":obj[21].toString());
		row.createCell(IDX_CELL_PREFIXO).setCellValue(obj[22] == null?"":obj[22].toString());
		
		String sentido = obj[23].toString();
		row.createCell(IDX_CELL_SENTIDO).setCellValue(sentido.equals("1")  ? "IDA" : "VOLTA");
		
		row.createCell(IDX_CELL_VENDE).setCellValue(obj[24] == null ? "" : (Integer.parseInt(obj[24].toString()) == 1 ?"SIM" : "NAO"));
		if(obj[26] == null?false:((BigDecimal)obj[26]).intValue() == 1? true : false){
			row.createCell(IDX_CELL_CHAVEPORDEMANDA).setCellValue(obj[25] == null?"":obj[25].toString());
		}
		
		
		// novo preco:
		BigDecimal novoPrecio = null;
		
		if (cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.TARIFA.getDescricao()) || 
				cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.TODOS.getDescricao())){
			
			novoPrecio = atual;
			novoPrecio = novoPrecio.multiply(coeficiente).setScale(2, RoundingMode.HALF_UP);

			SXSSFCell cellNovoPrecio = (SXSSFCell) row.createCell(IDX_CELL_TARIFA_SIMULADA);//celula alterada
			cellNovoPrecio.setCellValue(novoPrecio.setScale(2).doubleValue());
			cellNovoPrecio.setCellStyle(estilo);
		} 
		
		if (cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.PEDAGIO.getDescricao())|| 
				cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.TODOS.getDescricao())){
			
			if (!validarComponente(obj, IDX_CELL_PEDAGIOATUAL)){
				return false;
			}
			
			novoPrecio = BigDecimal.valueOf(Double.valueOf(getStringImporteSafe(obj[16])));
			novoPrecio = novoPrecio.multiply(coeficiente).setScale(2, RoundingMode.HALF_UP);

			Cell cellNovoPrecio = row.createCell(IDX_CELL_PEDAGIOSIMULADO); //celula alterada
			cellNovoPrecio.setCellValue(novoPrecio.setScale(2).doubleValue());
			cellNovoPrecio.setCellStyle(estilo);
		}
		
		if (cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.TX_EMBARQUE.getDescricao())|| 
				cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.TODOS.getDescricao())){
			
			if (!validarComponente(obj, IDX_CELL_TXEMBARQUEATUAL)){
				return false;
			}
			
			novoPrecio = BigDecimal.valueOf(Double.valueOf(getStringImporteSafe(obj[18])));
			novoPrecio = novoPrecio.multiply(coeficiente).setScale(2, RoundingMode.HALF_UP);

			Cell cellNovoPrecio = row.createCell(IDX_CELL_TXEMBARQUESIMULADO); //celula alterada
			cellNovoPrecio.setCellValue(novoPrecio.setScale(2).doubleValue());
			cellNovoPrecio.setCellStyle(estilo);
		} 
		
		if (cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.SEGURO.getDescricao())|| 
				cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.TODOS.getDescricao())){
			
			if (!validarComponente(obj, IDX_CELL_SEGUROATUAL)){
				return false;
			}
			
			novoPrecio = BigDecimal.valueOf(Double.valueOf(getStringImporteSafe(obj[19])));
			novoPrecio = novoPrecio.multiply(coeficiente).setScale(2, RoundingMode.HALF_UP);

			Cell cellNovoPrecio = row.createCell(IDX_CELL_SEGUROSIMULADO); //celula alterada
			cellNovoPrecio.setCellValue(novoPrecio.setScale(2).doubleValue());
			cellNovoPrecio.setCellStyle(estilo);
		}
		
		if (cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.TPP.getDescricao())|| 
				cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.TODOS.getDescricao())){
			
			if (!validarComponente(obj, IDX_CELL_TPPATUAL)){
				return false;
			}
			
			novoPrecio = BigDecimal.valueOf(Double.valueOf(getStringImporteSafe(obj[20])));
			novoPrecio = novoPrecio.multiply(coeficiente).setScale(2, RoundingMode.HALF_UP);
			
			Cell cellNovoPrecio = row.createCell(IDX_CELL_TPPSIMULADO); //celula alterada
			cellNovoPrecio.setCellValue(novoPrecio.setScale(2).doubleValue());
			cellNovoPrecio.setCellStyle(estilo);
		} 
		return true;
	}
}
