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

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
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.event.Event;
import org.zkoss.zkplus.databind.BindingListModel;
import org.zkoss.zkplus.databind.BindingListModelList;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Estacion;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.TipoMovimentacion;
import com.rjconsultores.ventaboletos.service.EstacionService;
import com.rjconsultores.ventaboletos.service.MovimentacionBilhetesService;
import com.rjconsultores.ventaboletos.service.PuntoVentaService;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Controller("movimentacionBilhetesPuntoVentaController")
@Scope("prototype")
public class MovimentacionBilhetesPuntoVentaController extends MyGenericForwardComposer {

	@Autowired
	private MovimentacionBilhetesService movimentacionBilhetesService;
	
	@Autowired
	private EstacionService estacionService;
	
	@Autowired
	private PuntoVentaService puntoVentaService;
	
	private Combobox cmbTipoMovimentacion;
	private List<TipoMovimentacion> lsTipoMovimentacion;
	
	private Textbox txtForminicial;
	private Textbox txtFormfinal;	
//	private Textbox txtNumSerie;	
	private Combobox cmbNumSerie;
	private List<String> lsNumSerie;

	private List<Estacion> lsEstacion;
	private Combobox cmbEstacionOrigem;
	private Combobox cmbEstacionDestino;
	
	private List<PuntoVenta> lsPuntoVenta;
	private MyComboboxPuntoVenta cmbPuntoVenta;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		
		setLsEstacion(new ArrayList<Estacion>());		
		setLsNumSerie(new ArrayList<String>());
		setLsPuntoVenta(new ArrayList<PuntoVenta>());
		setLsTipoMovimentacion(movimentacionBilhetesService.obtenerTiposMovimetacionPuntoVenta());
		
		super.doAfterCompose(comp);
	}
	
	public void onChange$cmbPuntoVenta(Event ev) {
		Comboitem cbiPuntoVenta = cmbPuntoVenta.getSelectedItem();
		if (cbiPuntoVenta != null) {
			PuntoVenta puntoVenta = (PuntoVenta) cbiPuntoVenta.getValue();

			List<Estacion> estaciones = estacionService.buscarEstaciones(puntoVenta);
			
			lsEstacion.clear();
			lsEstacion.addAll(estaciones);
			BindingListModel listModelEstacion = new BindingListModelList(lsEstacion, true);
			cmbEstacionOrigem.setSelectedIndex(-1);
			cmbEstacionOrigem.setModel(listModelEstacion);			
			cmbEstacionDestino.setModel(listModelEstacion);
		}
	}
	
	
	public void onChange$cmbEstacionOrigem(Event ev) {
		Comboitem origemSeleccionada = cmbEstacionOrigem.getSelectedItem();			
		Estacion origem = origemSeleccionada != null ? (Estacion)origemSeleccionada.getValue() : null;
		
		if (origem != null) 
			bindModelCmbNumSerie(origem);
	}
	
	
	public void onChange$cmbEstacionDestino(Event ev) {
		Comboitem origemSeleccionada = cmbEstacionOrigem.getSelectedItem();			
		
		Comboitem destinoSeleccionado = cmbEstacionDestino.getSelectedItem();
		Estacion destino = destinoSeleccionado != null ? (Estacion)destinoSeleccionado.getValue() : null;
		
		if (origemSeleccionada == null && destino != null)
			bindModelCmbNumSerie(destino);			
		
	}
	
	private void bindModelCmbNumSerie(Estacion estacion){
		List<String> numSeriesEstacion = movimentacionBilhetesService.buscarSeriesBilhetesPorEstacion(estacion);			
		lsNumSerie.addAll(numSeriesEstacion);
		cmbNumSerie.setModel(new BindingListModelList(lsNumSerie, true));
	}
	
	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		
		cmbPuntoVenta.getValue();
		cmbEstacionOrigem.getValue();
		cmbEstacionDestino.getValue();
		cmbTipoMovimentacion.getValue();
		cmbNumSerie.getValue();
		
		txtForminicial.getValue();
		
		try{
			
			Comboitem puntoVentaSeleccionada = cmbPuntoVenta.getSelectedItem();
			PuntoVenta puntoVenta = (PuntoVenta)puntoVentaSeleccionada.getValue();
			
			Comboitem origemSeleccionada = cmbEstacionOrigem.getSelectedItem();			
			Estacion origem = origemSeleccionada != null ? (Estacion)origemSeleccionada.getValue() : null;
			
			Comboitem destinoSeleccionado = cmbEstacionDestino.getSelectedItem();
			Estacion destino = destinoSeleccionado != null ? (Estacion)destinoSeleccionado.getValue() : null;
			
			Comboitem tipoMovSeleccionado = cmbTipoMovimentacion.getSelectedItem();
			TipoMovimentacion tipoMovimentacion = (TipoMovimentacion)tipoMovSeleccionado.getValue();
			
			String formInicial = txtForminicial.getValue();
			String formFinal = txtFormfinal.getValue();
			
//			String numSerie = txtNumSerie.getValue();
			Comboitem serieSeleccionado = cmbNumSerie.getSelectedItem();
			String numSerie = serieSeleccionado != null ? (String)serieSeleccionado.getValue() : null;
			
			if(StringUtils.isNotBlank(formInicial) && StringUtils.isNotBlank(formFinal) && StringUtils.isNotBlank(numSerie))
				movimentacionBilhetesService.realizaMovimentacionBilhetes(puntoVenta, origem, destino, numSerie, formInicial, formFinal, tipoMovimentacion);
						
			Messagebox.show(
					Labels.getLabel("movimentacionBilhetesController.MSG.suscribirOK"),
					Labels.getLabel("movimentacionBilhetesController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			
			cmbTipoMovimentacion.setSelectedItem(null);
			
			cmbPuntoVenta.setSelectedItem(null);
			cmbPuntoVenta.setText(null);
						
			cmbEstacionOrigem.setSelectedItem(null);
			cmbEstacionOrigem.getChildren().clear();
			
			cmbEstacionDestino.setSelectedItem(null);			
			cmbEstacionDestino.getChildren().clear();
			
			txtForminicial.setValue(null);
			txtFormfinal.setValue(null);
//			txtNumSerie.setValue(null);
			cmbNumSerie.setSelectedItem(null);
			cmbNumSerie.getChildren().clear();
		} catch (Exception ex) {
			
			String msgError = ex.getMessage();
			if(msgError == null)
				msgError = Labels.getLabel("MSG.Error");
			
			Messagebox.show(
					msgError,
					Labels.getLabel("movimentacionBilhetesController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
		
		
	}

	public Combobox getCmbTipoMovimentacion() {
		return cmbTipoMovimentacion;
	}

	public void setCmbTipoMovimentacion(Combobox cmbTipoMovimentacion) {
		this.cmbTipoMovimentacion = cmbTipoMovimentacion;
	}

	public List<TipoMovimentacion> getLsTipoMovimentacion() {
		return lsTipoMovimentacion;
	}

	public void setLsTipoMovimentacion(List<TipoMovimentacion> lsTipoMovimentacion) {
		this.lsTipoMovimentacion = lsTipoMovimentacion;
	}

	public Textbox getTxtForminicial() {
		return txtForminicial;
	}

	public void setTxtForminicial(Textbox txtForminicial) {
		this.txtForminicial = txtForminicial;
	}

	public Textbox getTxtFormfinal() {
		return txtFormfinal;
	}

	public void setTxtFormfinal(Textbox txtFormfinal) {
		this.txtFormfinal = txtFormfinal;
	}

	public List<Estacion> getLsEstacion() {
		return lsEstacion;
	}

	public void setLsEstacion(List<Estacion> lsEstacion) {
		this.lsEstacion = lsEstacion;
	}

	public Combobox getCmbEstacionOrigem() {
		return cmbEstacionOrigem;
	}

	public void setCmbEstacionOrigem(Combobox cmbEstacionOrigem) {
		this.cmbEstacionOrigem = cmbEstacionOrigem;
	}

	public Combobox getCmbEstacionDestino() {
		return cmbEstacionDestino;
	}

	public void setCmbEstacionDestino(Combobox cmbEstacionDestino) {
		this.cmbEstacionDestino = cmbEstacionDestino;
	}


	public List<PuntoVenta> getLsPuntoVenta() {
		return lsPuntoVenta;
	}


	public void setLsPuntoVenta(List<PuntoVenta> lsPuntoVenta) {
		this.lsPuntoVenta = lsPuntoVenta;
	}

//	public Textbox getTxtNumSerie() {
//		return txtNumSerie;
//	}
//
//	public void setTxtNumSerie(Textbox txtNumserie) {
//		this.txtNumSerie = txtNumserie;
//	}

	public Combobox getCmbNumSerie() {
		return cmbNumSerie;
	}

	public void setCmbNumSerie(Combobox cmbNumSerie) {
		this.cmbNumSerie = cmbNumSerie;
	}

	public List<String> getLsNumSerie() {
		return lsNumSerie;
	}

	public void setLsNumSerie(List<String> lsNumSerie) {
		this.lsNumSerie = lsNumSerie;
	}

}
