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

import java.util.Calendar;
import java.util.List;

import org.apache.log4j.Logger;
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.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Row;

import com.rjconsultores.ventaboletos.entidad.DetDiagramaAutobus;
import com.rjconsultores.ventaboletos.entidad.DiagramaAutobus;
import com.rjconsultores.ventaboletos.service.DetDiagramaAutobusService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

/**
 * 
 * @author Administrador
 */
@Controller("editarDetDiagramaAutobusController")
@Scope("prototype")
public class EditarDetDiagramaAutobusController extends MyGenericForwardComposer {

	@Autowired
	private DetDiagramaAutobusService detDiagramaAutobusService;
	private DetDiagramaAutobus detDiagramaAutobus;
	private Short numefila;
	private Short numecolumna;
	private DiagramaAutobus diagramaAutobus;
	private Checkbox chkVendible;
	private Intbox txtAsiento;
	private Button button;
	private Combobox cmbTipo;
	private Combobox cmbDireccion;
	private Row rowAsiento;
	private Row rowVendible;
	private Row rowDireccion;
	private Comboitem cbiNorth;
	private Comboitem cbiWest;
	private Comboitem cbiEast;
	private Comboitem cbiSouth;
	private static Logger log = Logger.getLogger(EditarDetDiagramaAutobusController.class);
	public final static String ASIENTO = "ASIENTO";
	private String itemCombo = ASIENTO;
	private String itemOrientacion = DetDiagramaAutobus.ORIENTACION_W;

	public DetDiagramaAutobus getDetDiagramaAutobus() {
		return detDiagramaAutobus;
	}

	public void setDetDiagramaAutobus(DetDiagramaAutobus detDiagramaAutobus) {
		this.detDiagramaAutobus = detDiagramaAutobus;
	}

	public Checkbox getChkVendible() {
		return chkVendible;
	}

	public void setChkVendible(Checkbox chkVendible) {
		this.chkVendible = chkVendible;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		detDiagramaAutobus = (DetDiagramaAutobus) Executions.getCurrent().getArg().get("detDiagramaAutobus");

		super.doAfterCompose(comp);

		numefila = (Short) Executions.getCurrent().getArg().get("numefila");
		numecolumna = (Short) Executions.getCurrent().getArg().get("numecolumna");
		diagramaAutobus = (DiagramaAutobus) Executions.getCurrent().getArg().get("autobusDiagrama");
		button = (Button) Executions.getCurrent().getArg().get("button");

		chkVendible.setChecked(detDiagramaAutobus.getVendible() == null ? true : detDiagramaAutobus.getVendible());

		if ((numefila == 2) || (numefila == 6)) {
			itemCombo = DetDiagramaAutobus.TV;

			List<Component> children = cmbTipo.getChildren();
			for (Component c : children) {
				if (c instanceof Comboitem) {
					Comboitem ci = (Comboitem) c;
					if (((String) ci.getValue()).equals(ASIENTO)) {
						ci.setVisible(false);
					}
				}
			}
			rowAsiento.setVisible(false);
			rowVendible.setVisible(false);
			rowDireccion.setVisible(false);
		} else {

			itemOrientacion = detDiagramaAutobus.getOrientacion();
			
			if(itemOrientacion  == null){
				itemOrientacion=DetDiagramaAutobus.ORIENTACION_W;
			}
			
			if (detDiagramaAutobus.getAsiento() != null) {
				boolean noEsAsiento = noEsAsiento(detDiagramaAutobus.getAsiento());

				
				
				if (!noEsAsiento) {
					txtAsiento.setValue(Integer.parseInt(detDiagramaAutobus.getAsiento()));
				}

				rowAsiento.setVisible(!noEsAsiento);
				rowVendible.setVisible(!noEsAsiento);
				rowDireccion.setVisible(!noEsAsiento);

				itemCombo = noEsAsiento ? detDiagramaAutobus.getAsiento() : ASIENTO;
			}
		}

		txtAsiento.focus();
	}

	public void onClick$btnApagar(Event ev) {
		try {

			detDiagramaAutobus.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			detDiagramaAutobus.setFecmodif(Calendar.getInstance().getTime());
			detDiagramaAutobus.setActivo(Boolean.FALSE);

			if (detDiagramaAutobus.getDetdiagramaautobusId() != null) {
				detDiagramaAutobusService.borrar(detDiagramaAutobus);
			}

			button.setLabel("");

			closeWindow();
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(Labels.getLabel("MSG.Error"), Labels.getLabel("editarDiagramaAutobusController.window.title"), Messagebox.ERROR);
		}
	}

	private boolean noEsAsiento(String str) {
		return str.equals(DetDiagramaAutobus.CF)
				|| str.equals(DetDiagramaAutobus.PT)
				|| str.equals(DetDiagramaAutobus.TV)
				|| str.equals(DetDiagramaAutobus.ME)
				|| str.equals(DetDiagramaAutobus.WC)
				|| str.equals(DetDiagramaAutobus.GE)
				|| str.equals(DetDiagramaAutobus.ES);
	}

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

		if (cmbTipo.getSelectedItem().getValue().equals(ASIENTO) && (txtAsiento.getValue() == null)) {
			Messagebox.show(
					Labels.getLabel("editarDiagramaAutobusController.msg.asientoObligatorio"),
					Labels.getLabel("editarDiagramaAutobusController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);

			return;
		}

		try {
			// checando se jah existe esse assento:
			List<DetDiagramaAutobus> lsDetDiagramaAutobus = diagramaAutobus.getDetDiagramaAutobusList();
			Boolean existeAsiento = Boolean.FALSE;
			String novoAsiento = (noEsAsiento(cmbTipo.getSelectedItem().getValue().toString()) ? cmbTipo.getSelectedItem().getValue().toString() : txtAsiento.getValue().toString());// si
																																											// combobox
			Boolean temLetraNovoAsiento = novoAsiento.matches("^[a-zA-Z]+$");
			if (!temLetraNovoAsiento) {
				for (DetDiagramaAutobus dda : lsDetDiagramaAutobus) {
					String asiento = dda.getAsiento();
					if (asiento != null) {
						Boolean temLetra = asiento.matches("^[a-zA-Z]+$");
						if (!temLetra) {
							if (dda.getAsiento().equals(novoAsiento)) {
								if (((dda.getDetdiagramaautobusId() == null) || (detDiagramaAutobus.getDetdiagramaautobusId() == null)) || (!dda.getDetdiagramaautobusId().equals(detDiagramaAutobus.getDetdiagramaautobusId()))) {
									existeAsiento = Boolean.TRUE;
								}
							}
						}
					}
				}
			}

			if (!existeAsiento) {

				detDiagramaAutobus.setActivo(Boolean.TRUE);
				detDiagramaAutobus.setFecmodif(Calendar.getInstance().getTime());
				detDiagramaAutobus.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				detDiagramaAutobus.setNumecolumna(numecolumna);
				detDiagramaAutobus.setNumefila(numefila);
				detDiagramaAutobus.setDiagramaAutobus(diagramaAutobus);
				if (!cmbTipo.getSelectedItem().getValue().equals(ASIENTO)) {
					detDiagramaAutobus.setVendible(Boolean.FALSE);
					detDiagramaAutobus.setOrientacion("W");
				} else {
					detDiagramaAutobus.setVendible(chkVendible.isChecked());
					detDiagramaAutobus.setOrientacion(cmbDireccion.getSelectedItem().getValue().toString());
				}
				detDiagramaAutobus.setAsiento(novoAsiento);
				

				
				if (detDiagramaAutobus.getDetdiagramaautobusId() == null) {
					Integer posicionDdaExiste = null;	
					for (int i = 0; i < diagramaAutobus.getDetDiagramaAutobusList().size(); i++) {
						DetDiagramaAutobus dda = diagramaAutobus.getDetDiagramaAutobusList().get(i);

						if ((dda.getNumecolumna() == numecolumna) && (dda.getNumefila() == numefila)) {
							posicionDdaExiste = i;
						}

					}
					if (posicionDdaExiste == null) {
						log.info("add ok="+diagramaAutobus.getDetDiagramaAutobusList().add(detDiagramaAutobus));
					} else {
						diagramaAutobus.getDetDiagramaAutobusList().set(posicionDdaExiste, detDiagramaAutobus);
					}
					
					log.debug("add no existe=" + novoAsiento);
				} else {
					Integer index = diagramaAutobus.getDetDiagramaAutobusList().indexOf(detDiagramaAutobus);
					DetDiagramaAutobus temp = diagramaAutobus.getDetDiagramaAutobusList().get(index);

					temp.setActivo(detDiagramaAutobus.getActivo());
					temp.setAsiento(detDiagramaAutobus.getAsiento());
					temp.setDetdiagramaautobusId(detDiagramaAutobus.getDetdiagramaautobusId());
					temp.setDiagramaAutobus(detDiagramaAutobus.getDiagramaAutobus());
					temp.setFecmodif(detDiagramaAutobus.getFecmodif());
					temp.setInternet(detDiagramaAutobus.getInternet());
					temp.setNumecolumna(detDiagramaAutobus.getNumecolumna());
					temp.setNumefila(detDiagramaAutobus.getNumefila());
					temp.setUsuarioId(detDiagramaAutobus.getUsuarioId());
					if (!cmbTipo.getSelectedItem().getValue().equals(ASIENTO)) {
						temp.setVendible(Boolean.FALSE);
					} else {
						temp.setVendible(detDiagramaAutobus.getVendible());
					}
					log.debug("add ya existe=" + detDiagramaAutobus.getAsiento());
				}
				log.debug("cant itens=" + diagramaAutobus.getDetDiagramaAutobusList().size());
				closeWindow();
				button.setLabel(detDiagramaAutobus.getAsiento());
			} else {
				Messagebox.show(
						Labels.getLabel("editarDiagramaAutobusController.Existe.Asiento"),
						Labels.getLabel("editarDiagramaAutobusController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("",ex);
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarDiagramaAutobusController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		}
	}

	public void onChange$cmbTipo(Event ev) {
		cambiarPantallaTipo();
	}

	private void cambiarPantallaTipo() {
		Comboitem o = cmbTipo.getSelectedItem();
		if (o == null) {
			return;
		}

		String strSelected = (String) o.getValue();
		if (strSelected.equals(DetDiagramaAutobus.CF)
				|| strSelected.equals(DetDiagramaAutobus.PT)
				|| strSelected.equals(DetDiagramaAutobus.TV)
				|| strSelected.equals(DetDiagramaAutobus.ME)
				|| strSelected.equals(DetDiagramaAutobus.WC)
				|| strSelected.equals(DetDiagramaAutobus.GE)
				|| strSelected.equals(DetDiagramaAutobus.ES)) {

			rowAsiento.setVisible(false);
			rowVendible.setVisible(false);
			rowDireccion.setVisible(false);

			chkVendible.setChecked(false);

		} else {
			txtAsiento.setValue((Integer) null);
			chkVendible.setChecked(true);

			rowAsiento.setVisible(true);
			rowVendible.setVisible(true);
			rowDireccion.setVisible(true);
		}
	}

	public String getItemCombo() {
		return itemCombo;
	}

	public void setItemCombo(String itemCombo) {
		this.itemCombo = itemCombo;
	}

	public String getItemOrientacion() {
		return itemOrientacion;
	}

	public void setItemOrientacion(String itemOrientacion) {
		this.itemOrientacion = itemOrientacion;
	}	
}