/*
 * 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.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.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
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.ss.util.CellRangeAddress;
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.Tarifa;
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.TarifaService;
import com.rjconsultores.ventaboletos.service.TipoPuntoVentaService;
import com.rjconsultores.ventaboletos.service.VigenciaTarifaService;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
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.RenderCategoria;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderClaseServicio;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderEmpresaModificacionMassivaTarifa;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderMarca;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderMoneda;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderOrgaoConcedenteModifMassPreco;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderTipoPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderVigenciaTarifaModificacionMassivaTarifa;

/**
 * 
 * @author rodrigo
 */
@Controller("modificacionMasivaTarifasController")
@Scope("prototype")
public class ModificacionMasivaTarifasController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private final Integer CELL_ID_TARIFA = 0;
	@Autowired
	private TarifaService tarifaService;
	@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 cmbVigenciaTarifa;
	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 vigenciaTarifaList;
	private Textbox txtPorcentagem;
	private Radio radIncremento;
	private Radio radAgrupamentoLinhasSim;
	private Button btnGerarTarifas;
	private Tab tabTipoPuntoVenta;
	private Tab tabCategoria;
	

	private static Logger log = Logger.getLogger(ModificacionMasivaTarifasController.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.obtenerTodos();
		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 RenderEmpresaModificacionMassivaTarifa());
		rutaList.setItemRenderer(new RenderCatalogoDeRutas());
		orgaoConcedenteList.setItemRenderer(new RenderOrgaoConcedenteModifMassPreco());
		tipoPuntoVentaList.setItemRenderer(new RenderTipoPuntoVenta());
		categoriaList.setItemRenderer(new RenderCategoria());
		vigenciaTarifaList.setItemRenderer(new RenderVigenciaTarifaModificacionMassivaTarifa());
		

		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().generarTarifasAutomatica());

		// 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("modificacionMasivaTarifasController.MSG.SemVigencia"),
						Labels.getLabel("modificacionMasivaTarifasController.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
			HSSFWorkbook wb = new HSSFWorkbook();

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

			List<Object> lsRutaCombinacion = rutaCombinacionService.pesquisaTarifaObj(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", "modificacionMasivaTarifa.xls");

				fNomeArquivo.delete();

			} else {
				Messagebox.show(Labels.getLabel("modificacionMasivaTarifasUploadController.MSG.excelVazio"),
						Labels.getLabel("modificacionMasivaTarifasController.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();

				Tarifa tarifa = tarifaService.obtenerID(idTarifa);

				v = tarifa.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/modificacionMasivaTarifasUpload.zul",
					Labels.getLabel("modificacionMasivaTarifasController.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$btnAdicionarVigenciaTarifa(Event ev) {
		Comboitem cbiVigenciaTarifa = cmbVigenciaTarifa.getSelectedItem();
		if (cbiVigenciaTarifa != null) {
			VigenciaTarifa vigenciaTarifa = (VigenciaTarifa) cbiVigenciaTarifa.getValue();

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

			cmbVigenciaTarifa.setSelectedItem(null);
		}
	}

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

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

	public void setLsOrgaoConcedente(List<OrgaoConcedente> lsOrgaoConcedente) {
		this.lsOrgaoConcedente = lsOrgaoConcedente;
	}
	
	private void gerarExcelSemAgrupamento(List<Object> lsRutaCombinacion, HSSFWorkbook wb, HSSFCellStyle estilo, BigDecimal coeficiente){
		HSSFSheet 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 sheetName = "";
				if (obj[4].toString().length() > 26) {
					sheetName = (obj[12].toString().concat("-").concat(obj[4].toString().substring(0, 26)));
				} else {
					sheetName = (obj[12].toString().concat("-").concat(obj[4].toString()));
				}
				sheetName = sheetName.replaceAll("/", "-");
				log.debug("Aba: " + sheetName);

				sheet1 = wb.createSheet(sheetName);
				contRow = 1;

				HSSFRow rowCabecalho = sheet1.createRow(0);

				HSSFCell cell = rowCabecalho.createCell(0);
				cell.setCellValue(Labels.getLabel("busquedaTarifaController.lhId.label"));
				cell.setCellStyle(estilo);

				HSSFCell cell0 = rowCabecalho.createCell(1);
				cell0.setCellValue(Labels.getLabel("busquedaTarifaController.lhTramo.label"));
				cell0.setCellStyle(estilo);

				HSSFCell cell1 = rowCabecalho.createCell(2);
				cell1.setCellValue(Labels.getLabel("busquedaTarifaController.lhOrigen.label"));
				cell1.setCellStyle(estilo);

				HSSFCell cell2 = rowCabecalho.createCell(3);
				cell2.setCellValue(Labels.getLabel("busquedaTarifaController.lhDestino.label"));
				cell2.setCellStyle(estilo);

				HSSFCell cell3 = rowCabecalho.createCell(4);
				cell3.setCellValue(Labels.getLabel("busquedaTarifaController.lhRuta.label"));
				cell3.setCellStyle(estilo);

				HSSFCell cell4 = rowCabecalho.createCell(5);
				cell4.setCellValue(Labels.getLabel("busquedaTarifaController.lhMarca.label"));
				cell4.setCellStyle(estilo);

				HSSFCell cell5 = rowCabecalho.createCell(6);
				cell5.setCellValue(Labels.getLabel("busquedaTarifaController.lhClaseServicio.label"));
				cell5.setCellStyle(estilo);

				HSSFCell cell6 = rowCabecalho.createCell(7);
				cell6.setCellValue(Labels.getLabel("busquedaTarifaController.lhFeciniciovigencia.label"));
				cell6.setCellStyle(estilo);

				HSSFCell cell7 = rowCabecalho.createCell(8);
				cell7.setCellValue(Labels.getLabel("busquedaTarifaController.lhMoneda.label"));
				cell7.setCellStyle(estilo);

				HSSFCell cell8 = rowCabecalho.createCell(9);
				cell8.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioOriginal.label"));
				cell8.setCellStyle(estilo);

				HSSFCell cell9 = rowCabecalho.createCell(10);
				cell9.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioExcel.label"));
				cell9.setCellStyle(estilo);

				HSSFCell cell10 = rowCabecalho.createCell(11);
				cell10.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioNuevo.label"));
				cell10.setCellStyle(estilo);

				HSSFCell cell12 = rowCabecalho.createCell(12);
				cell12.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioPedagio.label"));
				cell12.setCellStyle(estilo);
				
				HSSFCell cell13 = rowCabecalho.createCell(13);
				cell13.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioPedagioNuevo.label"));
				cell13.setCellStyle(estilo);
				
				HSSFCell cell14 = rowCabecalho.createCell(14);
				cell14.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioTxEmbarque.label"));
				cell14.setCellStyle(estilo);
				
				HSSFCell cell15 = rowCabecalho.createCell(15);
				cell15.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioTxEmbarqueSimulado.label"));
				cell15.setCellStyle(estilo);
				
				HSSFCell cell16 = rowCabecalho.createCell(16);
				cell16.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioSeguroAtual.label"));
				cell16.setCellStyle(estilo);
				
				HSSFCell cell17 = rowCabecalho.createCell(17);
				cell17.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioSeguroSimulado.label"));
				cell17.setCellStyle(estilo);				
				
				HSSFCell cell18 = rowCabecalho.createCell(18);
				cell18.setCellValue(Labels.getLabel("busquedaTarifaController.lhOrgaoLabel.label"));
				cell18.setCellStyle(estilo);				
			}

			HSSFRow row = sheet1.createRow(contRow++);

			row.createCell(0).setCellValue(Integer.parseInt(obj[0].toString()));
			row.createCell(1).setCellValue(obj[1].toString());
			row.createCell(2).setCellValue(obj[2].toString());
			row.createCell(3).setCellValue(obj[3].toString());
			row.createCell(4).setCellValue(obj[4].toString().concat(" (").concat(obj[12].toString()).concat(")"));
			row.createCell(5).setCellValue(obj[5].toString());
			row.createCell(6).setCellValue(obj[6].toString());

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

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

			row.createCell(7).setCellValue(sfFormatada.format(dataIni) + " - " + sfFormatada.format(dataFim));
			row.createCell(8).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(9).setCellValue(original.setScale(2).doubleValue());
			row.createCell(10).setCellValue(atual.setScale(2).doubleValue());

			String ped = getStringImporteSafe(obj[16]);
			BigDecimal pedVal = BigDecimal.valueOf(Double.valueOf(ped));
			row.createCell(12).setCellValue(pedVal.setScale(2).doubleValue());
			
			String txEmbarque = getStringImporteSafe(obj[18]);
			BigDecimal txEmbarqueVal = BigDecimal.valueOf(Double.valueOf(txEmbarque));
			row.createCell(14).setCellValue(txEmbarqueVal.setScale(2).doubleValue());	
			
			String seguro = getStringImporteSafe(obj[19]);
			BigDecimal seguroVal = BigDecimal.valueOf(Double.valueOf(seguro));
			row.createCell(16).setCellValue(seguroVal.setScale(2).doubleValue());				
			
			row.createCell(18).setCellValue(obj[17].toString());			

			// novo preco:
			BigDecimal novoPrecio = null;
			int celulaAlterada = 0;
			
			if (cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.TARIFA.getDescricao())){
				novoPrecio = atual;
				celulaAlterada = 11;
			} else if (cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.PEDAGIO.getDescricao())) {
				if (obj[16]==null){
					continue;
				}
				
				novoPrecio = BigDecimal.valueOf(Double.valueOf(getStringImporteSafe(obj[16])));
				celulaAlterada = 13;
			} else if (cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.TX_EMBARQUE.getDescricao())) {
				if (obj[18]==null){
					continue;
				}
				
				novoPrecio = BigDecimal.valueOf(Double.valueOf(getStringImporteSafe(obj[18])));
				celulaAlterada = 15;
			} else if (cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.SEGURO.getDescricao())) {
				if (obj[19]==null){
					continue;
				}
				
				novoPrecio = BigDecimal.valueOf(Double.valueOf(getStringImporteSafe(obj[19])));
				celulaAlterada = 17;
			}

			novoPrecio = novoPrecio.multiply(coeficiente).setScale(2, RoundingMode.HALF_UP);

			HSSFCell cellNovoPrecio = row.createCell(celulaAlterada);
			cellNovoPrecio.setCellValue(novoPrecio.setScale(2).doubleValue());
			cellNovoPrecio.setCellStyle(estilo);
		}
	}
	
	private void gerarExcelComAgrupamento(List<Object> lsRutaCombinacion, HSSFWorkbook wb, HSSFCellStyle estilo, BigDecimal coeficiente) {
		
		HSSFSheet 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()))) {
				int contCell = 0;
				
				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 = wb.createSheet("Agrupado por Linha");
					contRow = 0;
				}
				
				if (contRow > 0){
					HSSFRow rowLinhaBranco = sheet1.createRow(contRow++);
					HSSFCell cellLinhaBranco = rowLinhaBranco.createCell(0);
					sheet1.addMergedRegion(new CellRangeAddress(rowLinhaBranco.getRowNum(), rowLinhaBranco.getRowNum(), 0, 16));
					cellLinhaBranco.setCellValue("");
					cellLinhaBranco.setCellStyle(estilo);
				}
				
				HSSFRow rowTituloLinha = sheet1.createRow(contRow++);
				HSSFCell cellTituloLinha = rowTituloLinha.createCell(0);
				sheet1.addMergedRegion(new CellRangeAddress(rowTituloLinha.getRowNum(), rowTituloLinha.getRowNum(), 0, 16));
				cellTituloLinha.setCellValue(linha);
				cellTituloLinha.setCellStyle(estilo);
				
				HSSFRow rowCabecalho = sheet1.createRow(contRow++);

				HSSFCell cell = rowCabecalho.createCell(contCell++);
				cell.setCellValue(Labels.getLabel("busquedaTarifaController.lhId.label"));
				cell.setCellStyle(estilo);

				HSSFCell cell0 = rowCabecalho.createCell(contCell++);
				cell0.setCellValue(Labels.getLabel("busquedaTarifaController.lhTramo.label"));
				cell0.setCellStyle(estilo);

				HSSFCell cell1 = rowCabecalho.createCell(contCell++);
				cell1.setCellValue(Labels.getLabel("busquedaTarifaController.lhOrigen.label"));
				cell1.setCellStyle(estilo);

				HSSFCell cell2 = rowCabecalho.createCell(contCell++);
				cell2.setCellValue(Labels.getLabel("busquedaTarifaController.lhDestino.label"));
				cell2.setCellStyle(estilo);

				HSSFCell cell3 = rowCabecalho.createCell(contCell++);
				cell3.setCellValue(Labels.getLabel("busquedaTarifaController.lhRuta.label"));
				cell3.setCellStyle(estilo);

				HSSFCell cell4 = rowCabecalho.createCell(contCell++);
				cell4.setCellValue(Labels.getLabel("busquedaTarifaController.lhMarca.label"));
				cell4.setCellStyle(estilo);

				HSSFCell cell5 = rowCabecalho.createCell(contCell++);
				cell5.setCellValue(Labels.getLabel("busquedaTarifaController.lhClaseServicio.label"));
				cell5.setCellStyle(estilo);

				HSSFCell cell6 = rowCabecalho.createCell(contCell++);
				cell6.setCellValue(Labels.getLabel("busquedaTarifaController.lhFeciniciovigencia.label"));
				cell6.setCellStyle(estilo);

				HSSFCell cell7 = rowCabecalho.createCell(contCell++);
				cell7.setCellValue(Labels.getLabel("busquedaTarifaController.lhMoneda.label"));
				cell7.setCellStyle(estilo);

				HSSFCell cell8 = rowCabecalho.createCell(contCell++);
				cell8.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioOriginal.label"));
				cell8.setCellStyle(estilo);

				HSSFCell cell9 = rowCabecalho.createCell(contCell++);
				cell9.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioExcel.label"));
				cell9.setCellStyle(estilo);

				HSSFCell cell10 = rowCabecalho.createCell(contCell++);
				cell10.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioNuevo.label"));
				cell10.setCellStyle(estilo);

				HSSFCell cell12 = rowCabecalho.createCell(contCell++);
				cell12.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioPedagio.label"));
				cell12.setCellStyle(estilo);
				
				HSSFCell cell13 = rowCabecalho.createCell(contCell++);
				cell13.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioPedagioNuevo.label"));
				cell13.setCellStyle(estilo);
				
				HSSFCell cell14 = rowCabecalho.createCell(contCell++);
				cell14.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioTxEmbarque.label"));
				cell14.setCellStyle(estilo);
				
				HSSFCell cell15 = rowCabecalho.createCell(contCell++);
				cell15.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioTxEmbarqueSimulado.label"));
				cell15.setCellStyle(estilo);
				
				HSSFCell cell16 = rowCabecalho.createCell(contCell++);
				cell16.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioSeguroAtual.label"));
				cell16.setCellStyle(estilo);
				
				HSSFCell cell17 = rowCabecalho.createCell(contCell++);
				cell17.setCellValue(Labels.getLabel("busquedaTarifaController.lhPrecioSeguroSimulado.label"));
				cell17.setCellStyle(estilo);				
				
				HSSFCell cell18 = rowCabecalho.createCell(contCell++);
				cell18.setCellValue(Labels.getLabel("busquedaTarifaController.lhOrgaoLabel.label"));
				cell18.setCellStyle(estilo);
			}

			HSSFRow row = sheet1.createRow(contRow++);

			row.createCell(0).setCellValue(Integer.parseInt(obj[0].toString()));
			row.createCell(1).setCellValue(obj[1].toString());
			row.createCell(2).setCellValue(obj[2].toString());
			row.createCell(3).setCellValue(obj[3].toString());
			row.createCell(4).setCellValue(obj[4].toString().concat(" (").concat(obj[12].toString()).concat(")"));
			row.createCell(5).setCellValue(obj[5].toString());
			row.createCell(6).setCellValue(obj[6].toString());

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

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

			row.createCell(7).setCellValue(sfFormatada.format(dataIni) + " - " + sfFormatada.format(dataFim));
			row.createCell(8).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(9).setCellValue(original.setScale(2).doubleValue());
			row.createCell(10).setCellValue(atual.setScale(2).doubleValue());

			String ped = getStringImporteSafe(obj[16]);
			BigDecimal pedVal = BigDecimal.valueOf(Double.valueOf(ped));
			row.createCell(12).setCellValue(pedVal.setScale(2).doubleValue());
			
			String txEmbarque = getStringImporteSafe(obj[18]);
			BigDecimal txEmbarqueVal = BigDecimal.valueOf(Double.valueOf(txEmbarque));
			row.createCell(14).setCellValue(txEmbarqueVal.setScale(2).doubleValue());	
			
			String seguro = getStringImporteSafe(obj[19]);
			BigDecimal seguroVal = BigDecimal.valueOf(Double.valueOf(seguro));
			row.createCell(16).setCellValue(seguroVal.setScale(2).doubleValue());				
			
			row.createCell(18).setCellValue(obj[17].toString());

			// novo preco:
			BigDecimal novoPrecio = null;
			int celulaAlterada = 0;
			
			if (cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.TARIFA.getDescricao())){
				novoPrecio = atual;
				celulaAlterada = 11;
			} else if (cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.PEDAGIO.getDescricao())) {
				if (obj[16]==null){
					continue;
				}
				
				novoPrecio = BigDecimal.valueOf(Double.valueOf(getStringImporteSafe(obj[16])));
				celulaAlterada = 13;
			} else if (cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.TX_EMBARQUE.getDescricao())) {
				if (obj[18]==null){
					continue;
				}
				
				novoPrecio = BigDecimal.valueOf(Double.valueOf(getStringImporteSafe(obj[18])));
				celulaAlterada = 15;
			} else if (cmbComponentePreco.getSelectedItem().getValue().equals(EnumTarifaPedagio.SEGURO.getDescricao())) {
				if (obj[19]==null){
					continue;
				}
				
				novoPrecio = BigDecimal.valueOf(Double.valueOf(getStringImporteSafe(obj[19])));
				celulaAlterada = 17;
			}

			novoPrecio = novoPrecio.multiply(coeficiente).setScale(2, RoundingMode.HALF_UP);

			HSSFCell cellNovoPrecio = row.createCell(celulaAlterada);
			cellNovoPrecio.setCellValue(novoPrecio.setScale(2).doubleValue());
			cellNovoPrecio.setCellStyle(estilo);
		}
	}
}
