package com.rjconsultores.ventaboletos.web.gui.controladores.esquemaoperacional;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Messagebox;

import com.rjconsultores.ventaboletos.entidad.Conexion;
import com.rjconsultores.ventaboletos.entidad.ConexionConf;
import com.rjconsultores.ventaboletos.entidad.ConexionCtrl;
import com.rjconsultores.ventaboletos.entidad.ConexionDescuento;
import com.rjconsultores.ventaboletos.entidad.ConexionExcepcionRuta;
import com.rjconsultores.ventaboletos.entidad.ConexionRutaCtrl;
import com.rjconsultores.ventaboletos.entidad.ConexionRutaExcepcionPtoVta;
import com.rjconsultores.ventaboletos.entidad.ConexionRutaExcepcionTipoPtoVta;
import com.rjconsultores.ventaboletos.entidad.ConexionRutaTramoCtrl;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.TipoPuntoVenta;
import com.rjconsultores.ventaboletos.service.ConexionConfService;
import com.rjconsultores.ventaboletos.service.ConexionCtrlService;
import com.rjconsultores.ventaboletos.service.ConexionDescuentoService;
import com.rjconsultores.ventaboletos.service.ConexionExcepcionRutaService;
import com.rjconsultores.ventaboletos.service.ConexionRutaExcepcionPtoVtaService;
import com.rjconsultores.ventaboletos.service.ConexionRutaExcepcionTipoPtoVtaService;
import com.rjconsultores.ventaboletos.service.ConexionRutaTramoCtrlService;
import com.rjconsultores.ventaboletos.service.ConexionService;
import com.rjconsultores.ventaboletos.service.CorridaService;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.TipoPuntoVentaService;
import com.rjconsultores.ventaboletos.service.TramoService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.vo.conexion.ConexionVO;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConexionExcepcionRuta;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderEditarConexion;

@Controller("editarConexionRutaController")
@Scope("prototype")
public class EditarConexionRutaController extends MyGenericForwardComposer {
	private static final long serialVersionUID = 1L;

	@Autowired
	private ConexionExcepcionRutaService conexionExcepcionRutaService;
	@Autowired
	private ConexionService conexionService;
	@Autowired
	private ConexionCtrlService conexionCtrlService;
	@Autowired
	private ConexionConfService conexionConfService;
	@Autowired
	private ParadaService paradaService;
	@Autowired
	private RutaService rutaService;
	@Autowired
	private CorridaService corridaService;
	@Autowired
	ConexionDescuentoService conexionDescuentoService;
	@Autowired
	TramoService tramoService;

	@Autowired
	private ConexionRutaExcepcionTipoPtoVtaService conexionRutaExcepcionTipoPtoVtaService;
	@Autowired
	private ConexionRutaTramoCtrlService conexionRutaTramoCtrlService; 
	@Autowired
	private ConexionRutaExcepcionPtoVtaService conexionRutaRestricaoPtoVtaService;
	@Autowired
	private TipoPuntoVentaService tipoPuntoVentaService;

	private ConexionRutaCtrl conexionRutaCtrl;
	private List<TipoPuntoVenta> lsTipoPtovta;
	

	private Button btnSalvar;
	private Button btnApagar;
	private Intbox txtTiempoMin;
	private Intbox txtTiempoMax;
	private MyListbox conexionesEditarList;
	private MyListbox conexionesList;
	private MyListbox conexionExcepcionRutaList;
	private MyListbox conexionRutaPuntoVentaList;
	private MyListbox conexionRutaTipoPuntoVentaList;
	private MyComboboxParada cmbOrigemCntrl;
	private MyComboboxParada cmbDestinoCntrl;
	private MyComboboxParada cmbOrigemConexao;
	private MyComboboxParada cmbDestinoConexao;
	private MyComboboxEstandar cmbRuta;

	private ConexionCtrl conexionCtrl;
	private Parada origemCntrl;
	private Parada destinoCntrl;
	private Integer grupo;
	private Integer grupoInsercao;
	private Short secuencia;

	private List<Ruta> lsRutas;
	private List<Conexion> conexoesRemovidas;
	private List<Intbox> lsIntBox;
	private HashMap<Integer, ConexionConf> conexionesConfHash;
	private List<ConexionDescuento> conexoesDescontoRemovidas;
	private Combobox cmbTipoPtovta;
	private Combobox cmbPtovta;
	private Long conexionCtrlId;

	public ConexionCtrl getConexionCtrl() {
		return conexionCtrl;
	}

	public void setConexionCtrl(ConexionCtrl conexionCtrl) {
		this.conexionCtrl = conexionCtrl;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		grupo = 1;
		secuencia = 1;
		conexoesRemovidas = new ArrayList<Conexion>();
		conexoesDescontoRemovidas = new ArrayList<ConexionDescuento>();
		conexionesConfHash = new HashMap<Integer, ConexionConf>();

		lsRutas = rutaService.obtenerTodos();
		lsTipoPtovta = tipoPuntoVentaService.obtenerTodos();
		conexionesList = (MyListbox) Executions.getCurrent().getArg().get("conexionesList");

		conexionCtrlId = (Long) Executions.getCurrent().getArg().get("conexionCtrlId");
		if (conexionCtrlId != null) {
			conexionCtrl = conexionCtrlService.obtenerID(conexionCtrlId);
			buscaConfiguraciones();

			origemCntrl = paradaService.obtenerID(conexionCtrl.getOrigenId());
			cmbOrigemCntrl.setInitialValue(origemCntrl);
			cmbOrigemCntrl.setDisabled(Boolean.TRUE);
			cmbOrigemConexao.setInitialValue(origemCntrl);
			cmbDestinoConexao.setDisabled(false);

			destinoCntrl = paradaService.obtenerID(conexionCtrl.getDestinoId());
			cmbDestinoCntrl.setDisabled(Boolean.TRUE);
			cmbDestinoCntrl.setInitialValue(destinoCntrl);
		} else {
			conexionCtrl = null;
			btnApagar.setVisible(Boolean.FALSE);
		}

		List<Conexion> lsConexiones = getConexiones(conexionCtrlId);
		iniciaIntBoxes(lsConexiones);
		iniciaListBoxes();

		conexionesEditarList.setData(lsConexiones);
		conexionExcepcionRutaList.setData(conexionExcepcionRutaService.obtenerConexionExcepcionsActivo(conexionCtrlId));
		
		ConexionRutaTramoCtrl conexionRutaTramoCtrl = conexionRutaTramoCtrlService.buscarPorId(ConexionRutaTramoCtrl.getConexionRutaTramoConexionId(lsConexiones));
		conexionRutaCtrl = conexionRutaTramoCtrl.getConexionRutaCtrl();
//		conexionRutaPuntoVentaList.setData(conexionRutaRestricaoPtoVtaService.obtenerConexionRutaExcepcionPtoVtasActivo(conexionRutaTramoCtrl.getConexionRutaCtrl()));
//		conexionRutaTipoPuntoVentaList.setData(conexionRutaExcepcionTipoPtoVtaService.obtenerConexionRutaExcepcionTipoPtoVtaActivo(conexionRutaTramoCtrl.getConexionRutaCtrl()));
	}

	public void onBlur$cmbOrigemCntrl(Event event) throws InterruptedException {
		origemCntrl = cmbOrigemCntrl.getSelectedObject();
		cmbOrigemConexao.setInitialValue(origemCntrl);
		verificarConexionContr(cmbOrigemCntrl);
	}

	public void onBlur$cmbDestinoCntrl(Event event) throws InterruptedException {
		destinoCntrl = cmbDestinoCntrl.getSelectedObject();
		if (verificarConexionContr(cmbDestinoCntrl)) {
			cmbOrigemCntrl.setDisabled(true);
			cmbDestinoCntrl.setDisabled(true);
			cmbDestinoConexao.setDisabled(false);
		}
	}

	private Boolean verificarConexionContr(MyComboboxParada combo) throws InterruptedException {
		if (origemCntrl != null
				&& destinoCntrl != null && conexionCtrl == null
				&& !conexionService.buscarConexiones(false, origemCntrl.getParadaId(), destinoCntrl.getParadaId()).isEmpty()) {
			mostraMensagem(Labels.getLabel("editarConexionConfController.MSG.conexionCtrlExistente"));
			combo.setSelectedIndex(-1);
			return false;
		}
		return true;
	}

	private void buscaConfiguraciones() {
		conexionesConfHash = new HashMap<Integer, ConexionConf>();
		for (ConexionConf conexionConf : conexionConfService.buscarPorConexionCtrl(conexionCtrl)) {
			conexionesConfHash.put(conexionConf.getGrupo(), conexionConf);
		}
	}

	private List<Conexion> getConexiones(Long conexionCtrlId) {
		List<Conexion> lsConexiones = new ArrayList<Conexion>();
		if (conexionCtrlId != null) {
			lsConexiones = conexionService.buscarPorConexionCtrl(conexionCtrlId);

			if (!lsConexiones.isEmpty()) {
				Conexion conexion = lsConexiones.get(lsConexiones.size() - 1);
				grupo = conexion.getNumgrupo() + 1;
			}
		}
		return lsConexiones;
	}

	private void iniciaIntBoxes(List<Conexion> conexiones) {
		lsIntBox = new ArrayList<Intbox>();
		for (int i = 0; i < conexiones.size(); i++) {
			addIntBox();
		}
	}

	private void addIntBox() {
		final Intbox intbox = new Intbox();
		intbox.setStyle("border:0;");

		intbox.addEventListener("onClick", new EventListener() {
			@Override
			public void onEvent(Event arg0) throws Exception {
				Integer position = lsIntBox.indexOf(intbox);
				conexionesEditarList.setSelectedIndex(position);
			}
		});

		intbox.addEventListener("onBlur", new EventListener() {

			@Override
			public void onEvent(Event arg0) throws Exception {
				Integer position = lsIntBox.indexOf(intbox);
				Long corridaId = new Long(intbox.getText().isEmpty() ? "0" : intbox.getText());
				((Conexion) conexionesEditarList.getModel().getElementAt(position))
						.setCorridaId(validarServico(corridaId));
			}
		});
		lsIntBox.add(intbox);
	}

	private void iniciaListBoxes() {
		conexionesEditarList.setItemRenderer(new RenderEditarConexion(lsIntBox, conexionesConfHash));
		conexionExcepcionRutaList.setItemRenderer(new RenderConexionExcepcionRuta());

		conexionesEditarList.addEventListener("onDoubleClick", new EventListener() {

			@Override
			public void onEvent(Event arg0) throws Exception {
				verConfiguracaoConexao();
			}
		});

	}

	public void onClick$btnAddConexao(Event ev) throws InterruptedException {
		modoInsercao(true);

		Parada origem = cmbOrigemConexao.getSelectedObject();
		Parada destino = cmbDestinoConexao.getSelectedObject();
		Integer tempoMin = txtTiempoMin.getValue();
		Integer tempoMax = txtTiempoMax.getValue();

		Conexion conexion = new Conexion();
		conexion.setOrigenId(origem.getParadaId());
		conexion.setDestinoId(destino.getParadaId());
		conexion.setActivo(true);
		conexion.setNumgrupo(grupo);
		conexion.setNumsecuencia(secuencia);
		adicionarTrecho(destino, conexion, tempoMax, tempoMin);
	}

	private void adicionarTrecho(Parada destino, Conexion conexion, Integer tempoMax, Integer tempoMin) throws InterruptedException {
		cmbDestinoConexao.setConstraint("no empty");

		if (insercaoValida()) {
			criaConfiguracaoConexao(tempoMax, tempoMin);
			addIntBox();
			conexionesEditarList.addItemNovo(conexion);

			cmbOrigemConexao.setInitialValue(destino);
			cmbDestinoConexao.setInitialValue(destinoCntrl);
			cmbDestinoConexao.setFocus(true);

			if (destino.equals(destinoCntrl)) {
				finalizarInsercao();
			}
			secuencia++;
		}

		if (secuencia < 2) {
			cmbDestinoConexao.setConstraint("");
		}
	}

	private Boolean insercaoValida() throws InterruptedException {
		Parada origem = cmbOrigemConexao.getSelectedObject();
		Parada destino = cmbDestinoConexao.getSelectedObject();
		if (secuencia == 1 && destino.equals(destinoCntrl)) {
			mostraMensagem(Labels.getLabel("editarConexionController.MSG.minimoTrechos"));
			return false;
		}

		if (!tramoService.existe(origem, destino)) {
			mostraMensagem(Labels.getLabel("editarConexionController.MSG.trechoInexistente"));
			return false;
		}

		if (secuencia > 3 && !destino.equals(destinoCntrl)) {
			mostraMensagem(Labels.getLabel("editarConexionController.MSG.trechoFinal")
					+ " " + destinoCntrl.getDescparada());
			return false;
		}

		return true;

	}

	protected Long validarServico(Long corridaId) throws InterruptedException {
		if (corridaId != null && corridaId != 0) {
			if (corridaService.existeCorrida(corridaId)) {
				return corridaId;
			} else {
				mostraMensagem(Labels.getLabel("editarConexionController.MSG.servicoInvalido"));
				return null;
			}
		}
		return null;
	}

	private void criaConfiguracaoConexao(Integer tempoMax, Integer tempoMin) {
		if (secuencia == 1) {
			ConexionConf conexionConf = new ConexionConf();
			conexionConf.setGrupo(grupo);
			conexionConf.setTiempoMax(tempoMax);
			conexionConf.setTiempoMin(tempoMin);
			conexionConf.setIndisponible(false);
			conexionConf.setActivo(true);

			conexionesConfHash.put(grupo, conexionConf);
			txtTiempoMax.setDisabled(true);
			txtTiempoMin.setDisabled(true);
		}
	}

	public void finalizarInsercao() {
		secuencia = 1;
		grupo++;
		cmbOrigemConexao.setInitialValue(origemCntrl);
		cmbDestinoConexao.setSelectedIndex(-1);

		modoInsercao(false);
	}

	public void onClick$btnModificarConexao(Event ev) throws InterruptedException {
		verConfiguracaoConexao();
	}

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

		Parada origem = cmbOrigemCntrl.getSelectedObject();
		Parada destino = cmbDestinoCntrl.getSelectedObject();

		if (!verificarConexoesFixas()) {
			mostraMensagem(Labels.getLabel("editarConexionController.MSG.conexaoInvalida"));
			return;
		}

		if (conexionesEditarList.getSize() == 0) {
			mostraMensagem(Labels.getLabel("editarConexionController.MSG.conexaoInexistente"));
			return;
		}

		if (conexionCtrl == null) {
			conexionCtrl = new ConexionCtrl();

			conexionCtrl.setOrigenId(origem.getParadaId());
			conexionCtrl.setDestinoId(destino.getParadaId());
			conexionCtrlService.suscribir(conexionCtrl);
		} else {
			conexionCtrlService.actualizacion(conexionCtrl);
		}
		salvarConexiones();

		mostraMensagem(Labels.getLabel("editarConexionController.MSG.suscribirOK"));
		closeWindow();
	}

	@SuppressWarnings("unchecked")
	private Boolean verificarConexoesFixas() throws InterruptedException {
		Conexion conexionAnterior = null;
		Boolean valida = true;
		Boolean fixa = null;

		for (Conexion conexion : (List<Conexion>) conexionesEditarList.getListData()) {
			if (conexionAnterior != null && conexionAnterior.getNumgrupo() != conexion.getNumgrupo()) {
				valida = true;
				fixa = null;
			}

			if (fixa == null) {
				fixa = conexion.getCorridaId() != null;
			}

			if (fixa) {
				valida = valida && conexion.getCorridaId() != null;
			} else {
				valida = valida && conexion.getCorridaId() == null;
			}

			conexionAnterior = conexion;
		}

		return valida;
	}

	@SuppressWarnings("unchecked")
	private void salvarConexiones() {
		List<ConexionDescuento> conexionesDescuentos = new ArrayList<ConexionDescuento>();
		conexionesDescuentos.addAll(conexoesDescontoRemovidas);

		List<Conexion> conexoesSalvar = new ArrayList<Conexion>();
		conexoesSalvar.addAll((List<Conexion>) conexionesEditarList.getListData());
		conexoesSalvar.addAll(conexoesRemovidas);

		for (Conexion conexion : conexoesSalvar) {
			conexion.setConexionctrlId(conexionCtrl.getConexionctrlId());
			conexion.setFecmodif(Calendar.getInstance().getTime());
			conexion.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			conexionesDescuentos.addAll(conexion.getConexionesDescuentos());
		}

		for (ConexionDescuento conexionDescuento : conexionesDescuentos) {
			conexionDescuento.setFecModif(Calendar.getInstance().getTime());
		}

		conexionService.suscribirTodos(conexoesSalvar);
		conexionDescuentoService.suscribirTodos(conexionesDescuentos);
		salvarConexionesConf();
		 salvarExcecionPuntoVenta();
		 salvarExcecionCanalVenta();
	}

	private void salvarConexionesConf() {
		for (ConexionConf conexionConf : conexionesConfHash.values()) {
			conexionConf.setConexionCtrl(conexionCtrl);
			conexionConf.setFecmodif(Calendar.getInstance().getTime());
			conexionConf.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		}
		conexionConfService.suscribirTodos(conexionesConfHash.values());
	}
	
	private void salvarExcecionCanalVenta() {
		
		@SuppressWarnings("unchecked")
		List<ConexionRutaExcepcionTipoPtoVta> conexionRutaTipoPuntoVentas = conexionRutaTipoPuntoVentaList.getListData();	

		ConexionRutaTramoCtrl conexionRutaTramoCtrl = conexionRutaTramoCtrlService.buscarPorId(ConexionRutaTramoCtrl.getConexionRutaTramoConexionId(getConexiones(conexionCtrlId)));				
//		conexionRutaExcepcionTipoPtoVtaService.borrar(conexionRutaExcepcionTipoPtoVtaService.obtenerConexionRutaExcepcionTipoPtoVtaActivo(conexionRutaTramoCtrl.getConexionRutaCtrl()));		
		conexionRutaExcepcionTipoPtoVtaService.suscribirTodos(conexionRutaTipoPuntoVentas);
		
	}
	
	private void salvarExcecionPuntoVenta() {
		
		@SuppressWarnings("unchecked")
		List<ConexionRutaExcepcionPtoVta> conexionRutapuntoVentas = conexionRutaPuntoVentaList.getListData();
		
		ConexionRutaTramoCtrl conexionRutaTramoCtrl = conexionRutaTramoCtrlService.buscarPorId(ConexionRutaTramoCtrl.getConexionRutaTramoConexionId(getConexiones(conexionCtrlId)));		
//		conexionRutaRestricaoPtoVtaService.borrar(conexionRutaRestricaoPtoVtaService.obtenerConexionRutaExcepcionPtoVtasActivo(conexionRutaTramoCtrl.getConexionRutaCtrl()));
		conexionRutaRestricaoPtoVtaService.suscribirTodos(conexionRutapuntoVentas);
	}

	public void onClick$btnRemoverConexao(Event ev) throws Exception {
		Conexion conexao = (Conexion) conexionesEditarList.getSelected();
		if (conexao == null) {
			mostraMensagem(Labels.getLabel("editarConexionController.MSG.selecionarConexion"));
			return;
		}

		if (grupoInsercao != null && !grupoInsercao.equals(conexao.getNumgrupo())) {
			mostraMensagem(Labels.getLabel("editarConexionController.MSG.emInsercao") + " " + grupo);
			return;
		}

		if (Messagebox.show(
				Labels.getLabel("editarConexionController.MSG.borrarConexionPergunta"),
				Labels.getLabel("editarConexionController.window.title"),
				Messagebox.YES | Messagebox.NO, Messagebox.QUESTION) == Messagebox.YES) {

			removerConexoes(conexao.getNumgrupo());

			if (conexionesConfHash.get(conexao.getNumgrupo()) != null) {
				conexionesConfHash.get(conexao.getNumgrupo()).setActivo(false);
			}
			modoInsercao(false);
		}
	}

	public void onClick$btnDesativar(Event event) throws InterruptedException {
		Conexion conexao = (Conexion) conexionesEditarList.getSelected();
		if (conexao == null) {
			mostraMensagem(Labels.getLabel("editarConexionController.MSG.selecionarConexion"));
			return;
		}

		conexionesConfHash.get(conexao.getNumgrupo()).setIndisponible(true);
		conexionesEditarList.updateItem(conexionesEditarList.getItemAtIndex(0).getValue());
	}

	public void onClick$btnAtivar(Event event) throws InterruptedException {

		Conexion conexao = (Conexion) conexionesEditarList.getSelected();
		if (conexao == null) {
			mostraMensagem(Labels.getLabel("editarConexionController.MSG.selecionarConexion"));
			return;
		}

		conexionesConfHash.get(conexao.getNumgrupo()).setIndisponible(false);
		conexionesEditarList.updateItem(conexionesEditarList.getItemAtIndex(0).getValue());
	}

	@SuppressWarnings("unchecked")
	private void removerConexoes(Integer numgrupo) {
		List<Conexion> conexiones = new ArrayList<Conexion>();
		conexiones.addAll((List<Conexion>) conexionesEditarList.getListData());

		for (Conexion conexion : conexiones) {
			if (conexion.getNumgrupo() == numgrupo) {
				conexion.setActivo(false);

				lsIntBox.remove(((List<Conexion>) conexionesEditarList.getListData()).indexOf(conexion));
				conexionesEditarList.removeItem(conexion);

				if (conexion.getConexionctrlId() != null) {
					conexoesRemovidas.add(conexion);
					conexoesDescontoRemovidas.addAll(setConexeosDescontoInativa(conexion.getConexionesDescuentos()));
				} else {
					conexionesConfHash.remove(numgrupo);
				}

				conexion.getConexionesDescuentos().clear();
			}
		}

		if (conexionesConfHash.get(numgrupo) != null) {
			conexionesConfHash.get(numgrupo).setActivo(false);
		}
	}

	private List<ConexionDescuento> setConexeosDescontoInativa(List<ConexionDescuento> conexionesDescuentos) {
		for (ConexionDescuento conexionDescuento : conexionesDescuentos) {
			conexionDescuento.setActivo(false);
		}
		return conexionesDescuentos;
	}
	
	public void onClick$btnNovoCanalVenta(Event ev) throws InterruptedException {
		
		if(cmbTipoPtovta.getSelectedItem() == null){
			return;
		}
		TipoPuntoVenta ptovta = (TipoPuntoVenta) cmbTipoPtovta.getSelectedItem().getValue();
		
		ConexionRutaExcepcionTipoPtoVta  conexionRutaExcepcionTipoPtoVta = new ConexionRutaExcepcionTipoPtoVta();
//		conexionRutaExcepcionTipoPtoVta.setConexionRutaCtrl(conexionRutaCtrl);
		conexionRutaExcepcionTipoPtoVta.setTipoPtovta(ptovta);
		
		if (conexionRutaTipoPuntoVentaList.getListData().contains(ptovta)) {
			Messagebox.show(
					Labels.getLabel("editarPricingEspecificoOcupacionController.MSG.noPricingEspecificoCanalJaCadastrado"),
					Labels.getLabel("busquedaPricingEspecificoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		} else {
			if(ptovta.getTipoptovtaId() == -1){
				conexionRutaTipoPuntoVentaList.clear();
			}else {
				@SuppressWarnings("unchecked")
				List<ConexionRutaExcepcionTipoPtoVta> canaisVenta = conexionRutaTipoPuntoVentaList.getListData();
				for (ConexionRutaExcepcionTipoPtoVta tipoPuntoVenta : canaisVenta) {
					if(tipoPuntoVenta.getTipoPtovta().getTipoptovtaId() == -1){
						conexionRutaTipoPuntoVentaList.clear();
						conexionRutaTipoPuntoVentaList.addItemNovo(tipoPuntoVenta);
						ptovta = null;
						break;
					}
				}
			}
			if(ptovta != null) {
				conexionRutaTipoPuntoVentaList.addItemNovo(conexionRutaExcepcionTipoPtoVta);
			}
			
		}
		
		cmbTipoPtovta.setValue("");
	}
	
	public void onClick$btnApagarCanalVenta(Event ev) throws InterruptedException {

		int resp = Messagebox.show(
				Labels.getLabel("editarConexionExcepcionController.MSG.borrarConexionPergunta"),
				Labels.getLabel("editarConexionExcepcionController.window.title"),
				Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

		if (resp == Messagebox.YES) {
			if (conexionRutaTipoPuntoVentaList.getSelected() != null) {
				conexionRutaTipoPuntoVentaList.removeItem((ConexionRutaExcepcionTipoPtoVta) conexionRutaTipoPuntoVentaList.getSelectedItem().getValue());
			} else {
				Messagebox.show(Labels.getLabel("editarConexionExcepcionController.MSG.selecionarConexion"),
						Labels.getLabel("editarConexionExcepcionController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			}
		}
	}
	
	public void onClick$btnNovoPuntoVenta(Event ev) throws InterruptedException {
		
		if(cmbPtovta.getSelectedItem() == null){
			return;
		}
		PuntoVenta puntoVenta = (PuntoVenta) cmbPtovta.getSelectedItem().getValue();
		
		ConexionRutaExcepcionPtoVta  conexionRutaExcepcionPtoVta = new ConexionRutaExcepcionPtoVta();
//		conexionRutaExcepcionPtoVta.setConexionRutaCtrl(conexionRutaCtrl);
		conexionRutaExcepcionPtoVta.setPuntoVenta(puntoVenta);
		
		if (conexionRutaPuntoVentaList.getListData().contains(puntoVenta)) {
			Messagebox.show(
					Labels.getLabel("editarConexionPorRutaController.MSG.noPuntoVentaJaCadastrado"),
					Labels.getLabel("editarConexionPorRutaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		} else {
			if(puntoVenta.getPuntoventaId() == -1){
				conexionRutaPuntoVentaList.clear();
			}else {
				@SuppressWarnings("unchecked")
				List<ConexionRutaExcepcionPtoVta> canaisVenta = conexionRutaPuntoVentaList.getListData();
				for (ConexionRutaExcepcionPtoVta puntoVentaAux : canaisVenta) {
					if(puntoVentaAux.getPuntoVenta().getPuntoventaId() == -1){
						conexionRutaPuntoVentaList.clear();
						conexionRutaPuntoVentaList.addItemNovo(puntoVentaAux);
						puntoVenta = null;
						break;
					}
				}
			}
			if(puntoVenta != null) {
				conexionRutaPuntoVentaList.addItemNovo(conexionRutaExcepcionPtoVta);
			}
			
		}
		
		cmbTipoPtovta.setValue("");
	}
	
	public void onClick$btnApagarPuntoVenta(Event ev) throws InterruptedException {

		int resp = Messagebox.show(
				Labels.getLabel("editarConexionExcepcionController.MSG.borrarPuntoVentaPergunta"),
				Labels.getLabel("editarConexionPorRutaController.window.title"),
				Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

		if (resp == Messagebox.YES) {
			if (conexionRutaPuntoVentaList.getSelected() != null) {
				conexionRutaPuntoVentaList.removeItem((ConexionRutaExcepcionPtoVta) conexionRutaPuntoVentaList.getSelectedItem().getValue());
			} else {
				Messagebox.show(Labels.getLabel("editarConexionExcepcionController.MSG.selecionarConexion"),
						Labels.getLabel("editarConexionExcepcionController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			}
		}
	}

	public void onClick$btnApagar(Event ev) throws Exception {
		int resp = Messagebox.show(
				Labels.getLabel("editarConexionController.MSG.borrarConexionCtrlPergunta"),
				Labels.getLabel("editarConexionController.window.title"),
				Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

		if (resp == Messagebox.YES) {
			conexionCtrlService.borrar(conexionCtrl);

			mostraMensagem(Labels.getLabel("editarConexionController.MSG.borrarConexionCtrlSucesso"));

			conexionesList.setData(new ArrayList<ConexionVO>());

			closeWindow();
		}
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void verConfiguracaoConexao() throws InterruptedException {
		Map args = new HashMap();
		Conexion conexion = (Conexion) conexionesEditarList.getSelected();
		if(conexion ==null) {
			Messagebox.show(Labels.getLabel("editarConexionExcepcionController.MSG.selecionarConexion"),
					Labels.getLabel("editarConexionExcepcionController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
		}

		args.put("conexion", conexion);
		args.put("conexionConfHash", conexionesConfHash);
		args.put("listBoxConexoes", conexionesEditarList);
		args.put("conexoesDescontoRemovidas", conexoesDescontoRemovidas);

		openWindow("/gui/esquema_operacional/editarConexionConf.zul",
				Labels.getLabel("editarConexionConfController.window.title"), args, MODAL);
	}

	public void onClick$btnAddConexaoRutaExcepcion(Event ev) throws InterruptedException {
		ConexionExcepcionRuta ce = new ConexionExcepcionRuta();
		ce.setActivo(true);
		ce.setConexionctrlId(conexionCtrl.getConexionctrlId());
		ce.setRuta(((Ruta) cmbRuta.getSelectedItem().getValue()));
		conexionExcepcionRutaService.suscribir(ce);
		conexionExcepcionRutaList.addItemNovo(ce);
	}


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

		int resp = Messagebox.show(
				Labels.getLabel("editarConexionExcepcionController.MSG.borrarConexionPergunta"),
				Labels.getLabel("editarConexionExcepcionController.window.title"),
				Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

		if (resp == Messagebox.YES) {
			if (conexionExcepcionRutaList.getSelected() != null) {
				conexionExcepcionRutaService.borrar((ConexionExcepcionRuta) conexionExcepcionRutaList.getSelected());
				conexionExcepcionRutaList.removeItem((ConexionExcepcionRuta) conexionExcepcionRutaList.getSelected());
			} else {
				Messagebox.show(Labels.getLabel("editarConexionExcepcionController.MSG.selecionarConexion"),
						Labels.getLabel("editarConexionExcepcionController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			}
		}
	}

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

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

	public List<TipoPuntoVenta> getLsTipoPtovta() {
		return lsTipoPtovta;
	}

	public void setLsTipoPtovta(List<TipoPuntoVenta> lsTipoPtovta) {
		this.lsTipoPtovta = lsTipoPtovta;
	}

	private void mostraMensagem(String msg) throws InterruptedException {
		Messagebox.show(msg, Labels.getLabel("editarConexionController.window.title"), Messagebox.OK, Messagebox.INFORMATION);
	}

	private void modoInsercao(Boolean indInsercao) {
		btnSalvar.setVisible(!indInsercao);
		grupoInsercao = indInsercao ? grupo : null;

		if (indInsercao) {
			txtTiempoMax.setConstraint("no empty");
			txtTiempoMin.setConstraint("no empty");
			cmbDestinoConexao.setConstraint("no empty");
		} else {
			txtTiempoMax.setConstraint("");
			txtTiempoMin.setConstraint("");
			txtTiempoMax.setDisabled(false);
			txtTiempoMin.setDisabled(false);
			txtTiempoMax.setText("");
			txtTiempoMin.setText("");
			txtTiempoMin.setFocus(true);
			cmbDestinoConexao.setConstraint("");

			secuencia = 1;
			cmbOrigemConexao.setSelectedIndex(-1);
			cmbDestinoConexao.setSelectedIndex(-1);
		}
	}
}
