/*
 * 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.InputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

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.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.util.resource.Labels;
import org.zkoss.zhtml.Filedownload;
import org.zkoss.zhtml.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zkplus.databind.BindingListModelList;
import org.zkoss.zul.Button;
import org.zkoss.zul.Columns;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Decimalbox;
import org.zkoss.zul.Grid;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Row;
import org.zkoss.zul.RowRenderer;

import com.rjconsultores.ventaboletos.entidad.Ciudad;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.Moneda;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Plaza;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.RutaCombinacion;
import com.rjconsultores.ventaboletos.entidad.RutaSecuencia;
import com.rjconsultores.ventaboletos.entidad.Tarifa;
import com.rjconsultores.ventaboletos.entidad.Tramo;
import com.rjconsultores.ventaboletos.entidad.Via;
import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa;
import com.rjconsultores.ventaboletos.service.CiudadService;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.MarcaClaseServicioService;
import com.rjconsultores.ventaboletos.service.MarcaService;
import com.rjconsultores.ventaboletos.service.MercadoCompetidoService;
import com.rjconsultores.ventaboletos.service.MonedaService;
import com.rjconsultores.ventaboletos.service.RutaCombinacionService;
import com.rjconsultores.ventaboletos.service.RutaSecuenciaService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.TarifaMinimaService;
import com.rjconsultores.ventaboletos.service.TarifaService;
import com.rjconsultores.ventaboletos.service.TramoService;
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;

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

	private static final long serialVersionUID = 1L;
	@Autowired
	private TarifaService tarifaService;
	@Autowired
	private MarcaService marcaService;
	@Autowired
	private ClaseServicioService claseServicioService;
	@Autowired
	private MonedaService monedaService;
	@Autowired
	private VigenciaTarifaService vigenciaTarifaService;
	@Autowired
	private RutaService rutaService;
	@Autowired
	private TarifaMinimaService tarifaMinimaService;
	@Autowired
	private MercadoCompetidoService mercadoCompetidoService;
	@Autowired
	private TramoService tramoService;
	@Autowired
	private RutaSecuenciaService rutaSecuenciaService;
	@Autowired
	private RutaCombinacionService rutaCombinacionService;
	@Autowired
	private CiudadService ciudadService;
	@Autowired
	private MarcaClaseServicioService marcaClaseServicioService;
	private List<Marca> lsMarcas;
	private List<ClaseServicio> lsClaseServico;
	private List<Moneda> lsMonedas;
	private List<VigenciaTarifa> lsVigenciaTarifa;
	private List<Ruta> lsRutas;
	private List<RutaCombinacion> lsRutaCombinacion;
	private List<RutaSecuencia> lsRutaSecuencia;
	private Combobox cmbRuta;
	private Combobox cmbVigencia;
	private Combobox cmbMarca;
	private Combobox cmbMoneda;
	private Combobox cmbClaseServicio;
	private Grid grid;
	private Label msgRojo;
	private Button btnExportarExcel;
	private Button btnAutorizarEscala;
	private ListModelList lmList;
	private Map<Tramo, Tarifa> mapTramoTarifa;
	private Map<String, Tarifa> mapTramoTarifaNovo;
	private Map<Tramo, Decimalbox> mapTarifaTextbox;
	private List<List> lsGridRender;
	private static Logger log = Logger.getLogger(TarifaEscalaContorller.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<Ruta> getLsRutas() {
		return lsRutas;
	}

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

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

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

	public Combobox getCmbRuta() {
		return cmbRuta;
	}

	public void setCmbRuta(Combobox cmbRuta) {
		this.cmbRuta = cmbRuta;
	}

	public Combobox getCmbClaseServicio() {
		return cmbClaseServicio;
	}

	public void setCmbClaseServicio(Combobox cmbClaseServicio) {
		this.cmbClaseServicio = cmbClaseServicio;
	}

	public Combobox getCmbMarca() {
		return cmbMarca;
	}

	public void setCmbMarca(Combobox cmbMarca) {
		this.cmbMarca = cmbMarca;
	}

	public Combobox getCmbMoneda() {
		return cmbMoneda;
	}

	public void setCmbMoneda(Combobox cmbMoneda) {
		this.cmbMoneda = cmbMoneda;
	}

	public Combobox getCmbVigencia() {
		return cmbVigencia;
	}

	public void setCmbVigencia(Combobox cmbVigencia) {
		this.cmbVigencia = cmbVigencia;
	}

	public Grid getGrid() {
		return grid;
	}

	public void setGrid(Grid grid) {
		this.grid = grid;
	}

	public TarifaService getTarifaService() {
		return tarifaService;
	}

	public void setTarifaService(TarifaService tarifaService) {
		this.tarifaService = tarifaService;
	}

	public Label getMsgRojo() {
		return msgRojo;
	}

	public void setMsgRojo(Label msgRojo) {
		this.msgRojo = msgRojo;
	}

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

		btnExportarExcel.setDisabled(Boolean.TRUE);
		btnAutorizarEscala.setDisabled(Boolean.TRUE);

		lsMonedas = monedaService.obtenerTodos();
		lsClaseServico = claseServicioService.obtenerTodos();
		lsVigenciaTarifa = vigenciaTarifaService.obtenerTodos();

		msgRojo.setStyle("color:red;");

		ClaseServicio claseServicioTodos = claseServicioService.obtenerID(-1);
		if (claseServicioTodos != null) {
			lsClaseServico.remove(claseServicioTodos);
		}

		grid.setRowRenderer(new RowRenderer() {

			@Override
			public void render(Row row, Object data) throws Exception {
				if (data == null) {
					return;
				}

				String styleLatente = "color:red;";

				List list = (List) data;

				Columns columns = row.getGrid().getColumns();
				if (columns.getChildren() == null) {
					return;
				}

				for (Object st : list) {
					if (st instanceof Tarifa) {
						Tarifa tmp = (Tarifa) st;
						Decimalbox decimalBox = null;
						if (tmp.getPrecio() != null) {
							decimalBox = new Decimalbox(tmp.getPrecio().setScale(2));
						} else {
							decimalBox = new Decimalbox(new BigDecimal(0));
						}
						decimalBox.setInplace(true);

						if (tmp.getStatustarifa() == null) {
							decimalBox.setStyle(styleLatente);
						} else if (tmp.getStatustarifa().equals("L")) {
							decimalBox.setStyle(styleLatente);
						}

						mapTarifaTextbox.put(tmp.getTramo(), decimalBox);
						if (tmp.getTramo() != null) {
							decimalBox.setTooltiptext(tmp.getTramo().getDesctramo());
						}

						row.appendChild(decimalBox);
					} else if (st instanceof Parada) {
						Parada parada = (Parada) st;
						Label label = new Label(parada.getCveparada());
						label.setWidth("80px");
						row.appendChild(label);

					} else {
						Label label = new Label(st.toString());
						label.setWidth("80px");
						row.appendChild(label);
					}
					row.setWidth("80px");
				}
			}
		});

		lmList = new ListModelList();

		grid.setModel(lmList);
		grid.setAutopaging(true);

		int tamanho = lmList.size();

		mapTarifaTextbox = new HashMap<Tramo, Decimalbox>();

		cmbRuta.setDisabled(Boolean.TRUE);
	}

	private List<String> createStringList(String tipo) {
		List<String> resultItems = new ArrayList<String>();

		for (RutaCombinacion rc : lsRutaCombinacion) {
			String origem = rc.getTramo().getOrigem().toString();
			if (!resultItems.contains(origem)) {
				resultItems.add(origem);
			}

			String destino = rc.getTramo().getDestino().toString();
			if (!resultItems.contains(destino)) {
				resultItems.add(destino);
			}
		}

		// deixando as colunas em branco:
		if (tipo.equals("columns")) {
			List<String> resultColumns = new ArrayList<String>();
			for (int i = 0; i < resultItems.size(); i++) {
				resultColumns.add("");
			}

			return resultColumns;
		} else if (tipo.equals("items")) {
			return resultItems;
		} else {
			return new ArrayList<String>();
		}
	}

	private Via encontrarViaTramoNaoEstaSecuencia(String idOrigem, String idDestino) {

		Set<String> keys = mapTramoTarifaNovo.keySet();
		Tramo tr = null;
		for (Iterator<String> iterator = keys.iterator(); iterator.hasNext();) {
			String tramo = iterator.next();
			String tramoCveOrigenDestino[] = tramo.split("\\|");
			if ((tramoCveOrigenDestino[0].equals(idOrigem)) && (tramoCveOrigenDestino[1].equals(idDestino))) {
				List<Tramo> lsTr = tramoService.buscarCveParada(tramoCveOrigenDestino[0], tramoCveOrigenDestino[1], tramoCveOrigenDestino[2]);

				if (!lsTr.isEmpty()) {
					tr = lsTr.get(0);
				}
			}
		}
		if (tr != null) {
			return tr.getVia();
		} else {
			log.info("no fue encontrado en mpTramoTarifaNovo: Origen=" + idOrigem + ",Destino=" + idDestino);
			return null;
		}

	}

	public void onClick$btnPesquisa(Event ev) throws InterruptedException {
		cmbClaseServicio.getValue();
		cmbRuta.getValue();
		cmbVigencia.getValue();
		cmbMarca.getValue();
		cmbMoneda.getValue();

		try {
			Marca marca = (Marca) (cmbMarca.getSelectedItem() != null ? cmbMarca.getSelectedItem().getValue() : null);
			ClaseServicio claseServicio = (ClaseServicio) (cmbClaseServicio.getSelectedItem() != null ? cmbClaseServicio.getSelectedItem().getValue() : null);
			VigenciaTarifa vigenciaTarifa = (VigenciaTarifa) (cmbVigencia.getSelectedItem() != null ? cmbVigencia.getSelectedItem().getValue() : null);
			Moneda moneda = (Moneda) (cmbMoneda.getSelectedItem() != null ? cmbMoneda.getSelectedItem().getValue() : null);

			Ruta ruta = (Ruta) (cmbRuta.getSelectedItem() != null ? cmbRuta.getSelectedItem().getValue() : null);
			ruta = rutaService.obtenerID(ruta.getRutaId());

			if ((lsRutaCombinacion != null) && (!lsRutaCombinacion.isEmpty())) {
				lsRutaCombinacion.clear();
			}
			lsRutaCombinacion = ruta.getRutaCombinacionList();
			lsRutaSecuencia = rutaSecuenciaService.buscarSecuenciaOrdenado(ruta);

			mapTramoTarifa = new HashMap<Tramo, Tarifa>();
			mapTramoTarifaNovo = new HashMap<String, Tarifa>();

			log.debug("Inicio carga de combiaciones");
			for (RutaCombinacion rc : lsRutaCombinacion) {
				Tramo tramo = rc.getTramo();
				Tarifa tarifa = tarifaService.buscar(tramo, marca, claseServicio, vigenciaTarifa, moneda, rc.getRuta());

				if (tarifa == null) {
					tarifa = new Tarifa();
					tarifa.setPrecio(BigDecimal.ZERO);
					tarifa.setPreciooriginal(BigDecimal.ZERO);
					tarifa.setTramo(tramo);
					tarifa.setStatustarifa("L");
				}

				mapTramoTarifa.put(tramo, tarifa);
				mapTramoTarifaNovo.put(
						tramo.getOrigem().getParadaId().toString().concat("|").concat(tramo.getDestino().getParadaId().toString()).concat("|").concat(tramo.getVia().getViaId().toString()), tarifa);
			}
			log.debug("Fin carga de combiaciones");
			List<List> lsGridMatriz = new ArrayList<List>();
			for (int i = 0; i < lsRutaSecuencia.size(); i++) {
				List tmp = new ArrayList();

				for (int y = 0; y < lsRutaSecuencia.size(); y++) {
					// colocando nome da parada na diagonal:

					if (i == y) {
						Parada origem = lsRutaSecuencia.get(i).getTramo().getOrigem();
						tmp.add(origem);
					} else if (y > i) {
						Tarifa tarifa = null;

						if (y >= 1 && y < lsRutaSecuencia.size() - 1) {
							Via v = encontrarViaTramoNaoEstaSecuencia(lsRutaSecuencia.get(i).getTramo().getOrigem().getParadaId().toString(), lsRutaSecuencia.get(y).getTramo().getOrigem().getParadaId().toString());
							if (v != null) {
								tarifa = mapTramoTarifaNovo.get(lsRutaSecuencia.get(i).getTramo().getOrigem().getParadaId().toString().concat("|").concat(lsRutaSecuencia.get(y).getTramo().getOrigem().getParadaId().toString()).concat("|").concat(v.getViaId().toString()));
							}
						} else if (y == lsRutaSecuencia.size()) {
							Via v = encontrarViaTramoNaoEstaSecuencia(lsRutaSecuencia.get(i).getTramo().getOrigem().getParadaId().toString(), lsRutaSecuencia.get(y).getTramo().getDestino().getParadaId().toString());
							if (v != null) {
								tarifa = mapTramoTarifaNovo.get(lsRutaSecuencia.get(i).getTramo().getOrigem().getParadaId().toString().concat("|").concat(lsRutaSecuencia.get(y).getTramo().getDestino().getParadaId().toString()).concat("|").concat(v.getViaId().toString()));
							}
						} else {
							Via v = encontrarViaTramoNaoEstaSecuencia(lsRutaSecuencia.get(i).getTramo().getOrigem().getParadaId().toString(), lsRutaSecuencia.get(y).getTramo().getOrigem().getParadaId().toString());
							if (v != null) {
								tarifa = mapTramoTarifaNovo.get(lsRutaSecuencia.get(i).getTramo().getOrigem().getParadaId().toString().concat("|").concat(lsRutaSecuencia.get(y).getTramo().getOrigem().getParadaId().toString()).concat("|").concat(v.getViaId().toString()));
							}
						}
						if (tarifa == null) {
							// Tramo tt =
							// tramoService.obtenerTramotPorOrigemDestinoVia(lsRutaSecuencia.get(i).getTramo().getOrigem(),
							// lsRutaSecuencia.get(y).getTramo().getOrigem(),
							// lsRutaSecuencia.get(y).getTramo().getVia());
							RutaCombinacion rc = rutaCombinacionService.busquedaTramoRutaOrigemDestino(lsRutaSecuencia.get(i).getRuta(),
									lsRutaSecuencia.get(i).getTramo().getOrigem(), lsRutaSecuencia.get(y).getTramo().getOrigem());
							// Se nao existe a rutaCombinacion na ruta...
							if (rc == null) {
								tmp.add("");
							} else {
								tarifa = new Tarifa();
								tarifa.setPrecio(BigDecimal.ZERO);
								tarifa.setPreciooriginal(BigDecimal.ZERO);
								tarifa.setTramo(lsRutaSecuencia.get(i).getTramo());
								tarifa.setStatustarifa("L");
								tmp.add(tarifa);
							}
						} else {
							tmp.add(tarifa);
						}
					} else {
						tmp.add("");
					}
				}
				lsGridMatriz.add(tmp);
			}
			log.debug("Fin carga de las secuencias");

			lsGridRender = new ArrayList<List>();
			for (int i = 0; i < lsGridMatriz.size(); i++) {
				List tmpRender = new ArrayList();

				for (int y = 0; y < lsGridMatriz.size(); y++) {
					List tmp = lsGridMatriz.get(y);
					tmpRender.add(tmp.get(i));
				}

				tmpRender.add("");
				lsGridRender.add(tmpRender);
			}
			log.debug("Colocando ultimo tramo");
			// colocando ultimo tramo:
			// /------------------------------------------------------------>
			if (!lsRutaSecuencia.isEmpty()) {

				Parada destino = lsRutaSecuencia.get(lsRutaSecuencia.size() - 1).getTramo().getDestino();
				List tmpDestino = new ArrayList();
				for (int i = 0; i < lsRutaSecuencia.size(); i++) {
					log.info("Secuencia=" + lsRutaSecuencia.get(i).getRutasecuenciaId());

					// Pegar a Origem do Inicio com o Final da Ultima secuencia.
					RutaSecuencia rcIni = lsRutaSecuencia.get(i);
					RutaSecuencia rcFim = lsRutaSecuencia.get(lsRutaSecuencia.size() - 1);
					// Via v = lsRutaSecuencia.get(lsRutaSecuencia.size() -
					// 1).getTramo().getVia();

					String idOrigem = rcIni.getTramo().getOrigem().getParadaId().toString();
					String idDestino = rcFim.getTramo().getDestino().getParadaId().toString();
					Via v = encontrarViaTramoNaoEstaSecuencia(idOrigem, idDestino);

					if (v == null) {
						log.info("No fue encontrado la via para el origen y destino: " + idOrigem + "," + idDestino);
					}

					Tramo tramo = rcIni.getTramo();
					Tarifa tarifa = mapTramoTarifaNovo.get(rcIni.getTramo().getOrigem().getParadaId().toString().concat("|").concat(rcFim.getTramo().getDestino().getParadaId().toString()).concat("|").concat(v.getViaId().toString()));

					if (tarifa == null) {
						tarifa = new Tarifa();
						tarifa.setPrecio(BigDecimal.ZERO);
						tarifa.setPreciooriginal(BigDecimal.ZERO);
						tarifa.setTramo(tramo);
					}

					tmpDestino.add(tarifa);
				}

				// <--------------------------------------------------

				tmpDestino.add(destino);
				lsGridRender.add(tmpDestino);
			}

			// criando colunas em branco:
			if ((lsRutaCombinacion != null) && (!lsRutaCombinacion.isEmpty())) {
				Columns columns = grid.getColumns();
				if (columns.getChildren() == null) {
					return;
				}
				columns.detach();

				Map<String, Object> params = new HashMap<String, Object>();
				params.put("columns", createStringList("columns"));

				grid.appendChild(Executions.createComponents("/gui/tarifas/tarifa_escala/columns.zul", grid, params));

				lmList.clear();
				lmList.addAll(lsGridRender);

				if (lsGridRender.size() > 10 && lsGridRender.size() <= 20) {
					grid.setWidth("1250px");
				} else if (lsGridRender.size() > 20 && lsGridRender.size() <= 30) {
					grid.setWidth("1500px");
				} else if (lsGridRender.size() > 30 && lsGridRender.size() <= 40) {
					grid.setWidth("1750px");
				} else if (lsGridRender.size() > 40 && lsGridRender.size() <= 50) {
					grid.setWidth("2000px");
				} else if (lsGridRender.size() > 50 && lsGridRender.size() <= 60) {
					grid.setWidth("2500px");
				} else if (lsGridRender.size() > 60 && lsGridRender.size() <= 70) {
					grid.setWidth("2750px");
				} else if (lsGridRender.size() > 70 && lsGridRender.size() <= 80) {
					grid.setWidth("3000px");
				} else if (lsGridRender.size() > 80 && lsGridRender.size() <= 90) {
					grid.setWidth("3250px");
				} else if (lsGridRender.size() > 90 && lsGridRender.size() <= 100) {
					grid.setWidth("3500px");
				} else if (lsGridRender.size() > 100 && lsGridRender.size() <= 199) {
					grid.setWidth("5000px");
				} else if (lsGridRender.size() > 200) {
					grid.setWidth("8000px");
				}
			}

			btnExportarExcel.setDisabled(Boolean.FALSE);
			btnAutorizarEscala.setDisabled(Boolean.FALSE);

		} catch (Exception e) {
			e.printStackTrace();
			log.error("** Erro ao montar escala de tarifa: " + e, e);
			Messagebox.show(Labels.getLabel("MSG.Error"), Labels.getLabel("tarifaEscalaContorller.window.title"), Messagebox.OK,
					Messagebox.ERROR);
		}
	}

	public void onClick$btnAutorizarEscala(Event ev) throws InterruptedException {
		validacion();
		try {
			Integer opcao = Messagebox.show(Labels.getLabel("tarifaEscalaContorller.MSGAutoriazarEscala"),
					Labels.getLabel("tarifaEscalaContorller.window.title"), Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (opcao.equals(Messagebox.YES)) {
				// Autoriza e salvar junto, essa medida requer salvar e
				// recarregar as tarifas.
				onClick$btnSalvar(null);
				// Apos salvar tem que recarregar as tarifas
				onClick$btnPesquisa(null);

				if (mapTramoTarifa != null) {
					Set<Tramo> keys = mapTramoTarifa.keySet();
					for (Iterator<Tramo> iterator = keys.iterator(); iterator.hasNext();) {
						Tramo key = iterator.next();
						if (key != null) {
							Tarifa tarifa = mapTramoTarifa.get(key);
							tarifa.setStatustarifa("A");

							tarifa.setFecmodif(Calendar.getInstance().getTime());
							tarifa.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

							if (tarifa.getMarca() == null
									|| tarifa.getClaseServicio() == null
									|| tarifa.getMoneda() == null
									|| tarifa.getVigenciaTarifa() == null) {
								log.debug("Tarifa sem Marca ou Classe ou Moeda Tarifa ID: " + tarifa.getTarifaId());
								continue;
							}
							tarifaService.actualizacion(tarifa);
						}
					}

					onClick$btnPesquisa(null);

					Messagebox.show(Labels.getLabel("tarifaEscalaContorller.MSGEscalaAutoriazada"),
							Labels.getLabel("tarifaEscalaContorller.window.title"), Messagebox.OK, Messagebox.INFORMATION);
				} else {
					Messagebox.show(Labels.getLabel("tarifaEscalaContorller.MSGSelecioneEscala"),
							Labels.getLabel("tarifaEscalaContorller.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);
				}
			}
		} catch (Exception ex) {
			log.info("** Erro ao autorizar escala de tarifa: " + ex, ex);
			Messagebox.show(Labels.getLabel("MSG.Error"), Labels.getLabel("tarifaEscalaContorller.window.title"), Messagebox.OK,
					Messagebox.ERROR);
		}
	}

	public void validacion() {
		cmbClaseServicio.getValue();
		cmbRuta.getValue();
		cmbVigencia.getValue();
		cmbMarca.getValue();
		cmbMoneda.getValue();

	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {

		validacion();

		try {
			Marca marca = (Marca) (cmbMarca.getSelectedItem() != null ? cmbMarca.getSelectedItem().getValue() : null);
			ClaseServicio claseServicio = (ClaseServicio) (cmbClaseServicio.getSelectedItem() != null ? cmbClaseServicio.getSelectedItem().getValue() : null);
			VigenciaTarifa vigenciaTarifa = (VigenciaTarifa) (cmbVigencia.getSelectedItem() != null ? cmbVigencia.getSelectedItem().getValue() : null);
			Moneda moneda = (Moneda) (cmbMoneda.getSelectedItem() != null ? cmbMoneda.getSelectedItem().getValue() : null);
			Ruta ruta = (Ruta) (cmbRuta.getSelectedItem() != null ? cmbRuta.getSelectedItem().getValue() : null);
			ruta = rutaService.obtenerID(ruta.getRutaId());

			if (marca == null) {
				Messagebox.show(Labels.getLabel("tarifaEscalaContorller.MSGSelMarca"),
						Labels.getLabel("tarifaEscalaContorller.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);

				return;
			}

			if (claseServicio == null) {
				Messagebox.show(Labels.getLabel("tarifaEscalaContorller.MSGSelClaseServicio"),
						Labels.getLabel("tarifaEscalaContorller.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);

				return;
			}

			StringBuilder stTarifaMinima = new StringBuilder("");
			Set<String> keys = mapTramoTarifaNovo.keySet();
			for (Iterator<String> iterator = keys.iterator(); iterator.hasNext();) {
				String tramo = iterator.next();
				Tarifa tarifa = mapTramoTarifaNovo.get(tramo);
				if (tarifa != null) {
					tarifa.setMarca(marca);
					tarifa.setMoneda(moneda);
					tarifa.setClaseServicio(claseServicio);
					tarifa.setVigenciaTarifa(vigenciaTarifa);

					Parada origem = tarifa.getTramo().getOrigem();
					Parada destino = tarifa.getTramo().getDestino();
					Ciudad cidadeOrigem = null;
					Plaza plaza = null;
					if (origem.getCiudad() != null) {
						cidadeOrigem = ciudadService.obtenerID(origem.getCiudad().getCiudadId());
						plaza = cidadeOrigem.getPlaza();
					}

					tarifa.setOrigen(origem);
					tarifa.setDestino(destino);

					String tramoCveOrigenDestino[] = tramo.split("\\|");

					List<Tramo> lsTr = tramoService.buscarCveParada(tramoCveOrigenDestino[0], tramoCveOrigenDestino[1],
							tramoCveOrigenDestino[2]);

					if (!lsTr.isEmpty()) {
						Tramo tr = lsTr.get(0);
						// mapTramoTarifaNovo.get(tr.getOrigem().getCveparada().concat("|").concat(tr.getDestino().getCveparada().concat("|")).concat(tr.getVia().getNombvia()));

						// Indica se o mapTarifaTextbox foi renderizado. Ele só é renderizado se a pagina do tramo foi "paginada"/"acessada"
						// Quando o mapTarifaTextbox não foi carregado, não é exibido a mesg de tarifaMinima
						boolean mapTarifaTexboxRedenrizado = true;

						Decimalbox decimalBox = mapTarifaTextbox.get(tr);
						if (decimalBox == null) {
							mapTarifaTexboxRedenrizado = false;
							tarifa.setPrecio(BigDecimal.ZERO);
							tarifa.setPreciooriginal(BigDecimal.ZERO);
						} else {
							if (tarifa.getPrecio().compareTo(decimalBox.getValue()) == 0) {
								continue;
							}

							tarifa.setPreciooriginal(tarifa.getPrecio());
							tarifa.setPrecio(decimalBox.getValue());
						}
						tarifa.setFecmodif(Calendar.getInstance().getTime());
						tarifa.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
						tarifa.setActivo(Boolean.TRUE);
						tarifa.setRuta(ruta);
						tarifa.setOrgaoConcedente(ruta.getOrgaoConcedente());

						// checando se opode alterar o valor da tarifa de acordo
						// com o catalogo de tarifas minimas:
						Boolean podeAlterar = tarifaService.podeAlterarTarifaMinima(tarifa, marca, origem, destino, claseServicio, plaza,
								moneda);

						if (podeAlterar) {
							boolean existeMercadoCompetido = mercadoCompetidoService.existe(claseServicio, origem, destino);

							// caso encontre um mercado competido perguntar se
							// deseja alterar a tarifa mesmo assim:
							if (existeMercadoCompetido) {
								String stMercadoCompetido = tarifa.getTramo() + " - " + tarifa.getPrecio().setScale(2).toString();
								Integer opcao = Messagebox.show(
										stMercadoCompetido + ". "
												+ Labels.getLabel("tarifaEscalaContorller.MSGAlterarTarifaMercadoCompetido"),
										Labels.getLabel("tarifaEscalaContorller.window.title"), Messagebox.YES | Messagebox.NO,
										Messagebox.QUESTION);

								if (opcao.equals(Messagebox.YES)) {
									tarifa.setFecmodif(Calendar.getInstance().getTime());
									tarifa.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
									tarifa.setActivo(Boolean.TRUE);
									tarifa.setStatustarifa("L");

									tarifaService.actualizacion(tarifa);
								}
							} else {
								tarifa.setFecmodif(Calendar.getInstance().getTime());
								tarifa.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
								tarifa.setActivo(Boolean.TRUE);
								tarifa.setStatustarifa("L");

								if (tarifa.getTarifaId() == null) {
									tarifa = tarifaService.suscribir(tarifa);
								} else {
									tarifa = tarifaService.actualizacion(tarifa);
								}
							}
						} else {
							if (mapTarifaTexboxRedenrizado) {
								stTarifaMinima.append(tarifa.getTramo()).append(" - ").append(tarifa.getPrecio().setScale(2).toString());
								stTarifaMinima.append("\n");
							}
						}
					}
				}
			}

			onClick$btnPesquisa(null);

			if (stTarifaMinima.toString().equals("")) {
				if (ev != null) {
					Messagebox.show(Labels.getLabel("tarifaEscalaContorller.MSGTarifasAtualizadas"),
							Labels.getLabel("tarifaEscalaContorller.window.title"), Messagebox.OK, Messagebox.INFORMATION);
				}
			} else {
				Messagebox.show(Labels.getLabel("tarifaEscalaContorller.MSGNOPodeAlterarTarifaMinima") + "\n" + stTarifaMinima.toString()
						+ ". ", Labels.getLabel("tarifaEscalaContorller.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("** Erro ao salvar escala de tarifa: " + ex, ex);
			Messagebox.show(Labels.getLabel("MSG.Error"), Labels.getLabel("tarifaEscalaContorller.window.title"), Messagebox.OK,
					Messagebox.ERROR);

		}
	}

	public void onClick$btnExportarExcel(Event ev) throws InterruptedException {
		validacion();
		try {
			HSSFWorkbook wb = new HSSFWorkbook();

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

			HSSFSheet sheet1 = wb.createSheet(Labels.getLabel("tarifaEscalaContorller.window.title"));

			// cabeÃ§alho:
			VigenciaTarifa vt = (VigenciaTarifa) (cmbVigencia.getSelectedItem() != null ? cmbVigencia.getSelectedItem().getValue() : null);
			if (vt != null) {
				HSSFRow rowVigencia = sheet1.createRow(0);
				rowVigencia.createCell(0).setCellValue(
						Labels.getLabel("tarifaEscalaContorller.lhFeciniciovigencia.label") + ": " + vt.toString());
			} else {
				HSSFRow rowVigencia = sheet1.createRow(0);
				rowVigencia.createCell(0).setCellValue(Labels.getLabel("tarifaEscalaContorller.lhFeciniciovigencia.label") + ": ");
			}

			Moneda moneda = (Moneda) (cmbMoneda.getSelectedItem() != null ? cmbMoneda.getSelectedItem().getValue() : null);
			if (moneda != null) {
				HSSFRow rowMoneda = sheet1.createRow(1);
				rowMoneda.createCell(0).setCellValue(Labels.getLabel("tarifaEscalaContorller.lhMoneda.label") + ": " + moneda.toString());
			} else {
				HSSFRow rowMoneda = sheet1.createRow(1);
				rowMoneda.createCell(0).setCellValue(Labels.getLabel("tarifaEscalaContorller.lhMoneda.label") + ": ");
			}

			Ruta ruta = (Ruta) (cmbRuta.getSelectedItem() != null ? cmbRuta.getSelectedItem().getValue() : null);
			if (ruta != null) {
				HSSFRow rowRuta = sheet1.createRow(2);
				rowRuta.createCell(0).setCellValue(Labels.getLabel("tarifaEscalaContorller.lhRuta.label") + ": " + ruta.toString());
			} else {
				HSSFRow rowRuta = sheet1.createRow(2);
				rowRuta.createCell(0).setCellValue(Labels.getLabel("tarifaEscalaContorller.lhRuta.label") + ": ");
			}

			Marca marca = (Marca) (cmbMarca.getSelectedItem() != null ? cmbMarca.getSelectedItem().getValue() : null);
			if (marca != null) {
				HSSFRow rowMarca = sheet1.createRow(3);
				rowMarca.createCell(0).setCellValue(Labels.getLabel("tarifaEscalaContorller.lhMarca.label") + ": " + marca.toString());
			} else {
				HSSFRow rowMarca = sheet1.createRow(3);
				rowMarca.createCell(0).setCellValue(Labels.getLabel("tarifaEscalaContorller.lhMarca.label") + ": ");
			}

			ClaseServicio claseService = (ClaseServicio) (cmbClaseServicio.getSelectedItem() != null ? cmbClaseServicio.getSelectedItem().getValue() : null);
			if (claseService != null) {
				HSSFRow rowClaseService = sheet1.createRow(4);
				rowClaseService.createCell(0).setCellValue(
						Labels.getLabel("tarifaEscalaContorller.lhClaseServicio.label") + ": " + claseService.toString());
			} else {
				HSSFRow rowClaseService = sheet1.createRow(4);
				rowClaseService.createCell(0).setCellValue(Labels.getLabel("tarifaEscalaContorller.lhClaseServicio.label") + ": ");
			}

			// linha vazia entre o cabeÃ§alho e escala:
			HSSFRow rowEspaco = sheet1.createRow(5);
			rowEspaco.createCell(0).setCellValue("");

			for (int i = 0; i < lsGridRender.size(); i++) {
				List list = lsGridRender.get(i);

				HSSFRow row = sheet1.createRow(i + 6);
				for (int j = 0; j < list.size(); j++) {
					Object st = list.get(j);

					if (st instanceof Tarifa) {
						Tarifa tmp = (Tarifa) st;

						row.createCell(j).setCellValue(tmp.getPrecio().setScale(2).toString());
					} else if (st instanceof Parada) {
						Parada parada = (Parada) st;

						HSSFCell cell = row.createCell(j);
						cell.setCellStyle(estilo);

						cell.setCellValue(parada.getCveparada());
					} else {
						row.createCell(j).setCellValue(st.toString());
					}
				}
			}

			String nomeArquivo = UsuarioLogado.getUsuarioLogado().getNombusuario() + "_" + Calendar.getInstance().getTime().getTime() + "_"
					+ "escala";

			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", "escala.xls");

			fNomeArquivo.delete();
		} catch (Exception ex) {

			log.info("** Erro ao exportar escala de tarifa: " + ex);
			log.error("** Erro ao exportar escala de tarifa: " + ex);
			Messagebox.show(Labels.getLabel("MSG.Error"), Labels.getLabel("tarifaEscalaContorller.window.title"), Messagebox.OK,
					Messagebox.ERROR);

		}
	}

	public void onChange$cmbClaseServicio(Event ev) {
		Comboitem cbiClaseServicio = cmbClaseServicio.getSelectedItem();

		if (cbiClaseServicio != null) {
			ClaseServicio claseServicio = (ClaseServicio) cbiClaseServicio.getValue();

			if (ApplicationProperties.getInstance().rutaConMasDeUnaClase()) {
				lsRutas = rutaService.obtenerTodos();
			} else {
				lsRutas = rutaService.buscarPorClaseServicio(claseServicio);
			}

			cmbRuta.setConstraint("");
			cmbRuta.setSelectedItem(null);
			cmbRuta.setText(null);
			BindingListModelList modelRuta = new BindingListModelList(lsRutas, true);
			cmbRuta.setModel(modelRuta);
			cmbRuta.setConstraint("no empty");
			cmbRuta.setDisabled(Boolean.FALSE);

			lsMarcas = marcaClaseServicioService.buscar(claseServicio);
			cmbMarca.setConstraint("");
			cmbMarca.setSelectedItem(null);
			cmbMarca.setText(null);
			BindingListModelList modelMarcas = new BindingListModelList(lsMarcas, true);
			cmbMarca.setModel(modelMarcas);
			cmbMarca.setConstraint("no empty");

		}
		btnExportarExcel.setDisabled(Boolean.TRUE);
		btnAutorizarEscala.setDisabled(Boolean.TRUE);
	}

	public void onChange$cmbRuta(Event ev) {
		btnExportarExcel.setDisabled(Boolean.TRUE);
		btnAutorizarEscala.setDisabled(Boolean.TRUE);
	}

	public void onChange$cmbVigencia(Event ev) {
		btnExportarExcel.setDisabled(Boolean.TRUE);
		btnAutorizarEscala.setDisabled(Boolean.TRUE);
	}

	public void onChange$cmbMarca(Event ev) {
		btnExportarExcel.setDisabled(Boolean.TRUE);
		btnAutorizarEscala.setDisabled(Boolean.TRUE);
	}

	public void onChange$cmbMoneda(Event ev) {
		btnExportarExcel.setDisabled(Boolean.TRUE);
		btnAutorizarEscala.setDisabled(Boolean.TRUE);
	}
}
