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

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

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 com.rjconsultores.ventaboletos.entidad.CasetaPeaje;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.ParadaSecuencia;
import com.rjconsultores.ventaboletos.entidad.RutaCaseta;
import com.rjconsultores.ventaboletos.entidad.RutaSecuencia;
import com.rjconsultores.ventaboletos.entidad.Tramo;
import com.rjconsultores.ventaboletos.entidad.Via;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.CasetaPeajeService;
import com.rjconsultores.ventaboletos.service.RutaCasetaService;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderCasetaPeaje;

@Controller("editarSecuenciaController")
@Scope("prototype")
public class EditarSecuenciaController extends MyGenericForwardComposer{
	
	private static final long serialVersionUID = 1L;
	private ParadaSecuencia paradaSeqOrigen;
	private ParadaSecuencia paradaSeqDestino;
	private String localidadeOrigen;
	private String localidadeDestino;
	private MyListbox casetaPeajeList;
	private List<CasetaPeaje> lsCasetaPeaje;
	
	private List<RutaSecuencia> lsRutaSecuencia;
	
	@Autowired
	private CasetaPeajeService casetaPeajeService;
	@Autowired
	private RutaCasetaService rutaCasetaService; 
	
	private MyComboboxEstandar cmbTodasCasetasPeaje;
	private List<CasetaPeaje> lsTodasCasetasPeaje;
	
	private List<ParadaSecuencia> lsParadasSequencia;
	private MyListbox rutaSecuenciaList;
	
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		paradaSeqOrigen = (ParadaSecuencia) Executions.getCurrent().getArg().get("paradaSecuenciaOrigen");
		paradaSeqDestino = (ParadaSecuencia) Executions.getCurrent().getArg().get("paradaSecuenciaDestino");
		lsRutaSecuencia = (List<RutaSecuencia>)Executions.getCurrent().getArg().get("lsRutaSecuencia");
		
		lsParadasSequencia = (List<ParadaSecuencia>)Executions.getCurrent().getArg().get("lsParadasSequencia");
		rutaSecuenciaList = (MyListbox)Executions.getCurrent().getArg().get("rutaSecuenciaList");
		lsCasetaPeaje  = (List<CasetaPeaje>)Executions.getCurrent().getArg().get("casetasList");
		casetaPeajeList.setData(lsCasetaPeaje);
		
		getLocalidadeDestino();
		getLocalidadeOrigen();
		casetaPeajeList.setItemRenderer(new RenderCasetaPeaje());
//		lsCasetaPeaje = new ArrayList<CasetaPeaje>();
		
		lsTodasCasetasPeaje =  casetaPeajeService.buscarTodosOrdenadoPorDescricao();
	}


	public ParadaSecuencia getParadaSeqOrigen() {
		return paradaSeqOrigen;
	}


	public void setParadaSeqOrigen(ParadaSecuencia paradaSeq) {
		this.paradaSeqOrigen = paradaSeq;
	}

	public String getLocalidadeOrigen() {
		localidadeOrigen = paradaSeqOrigen.getParada().getCveparada()+" - "+paradaSeqOrigen.getParada().getDescparada();
		return localidadeOrigen;
	}


	public void setLocalidadeOrigen(String localidade) {
		this.localidadeOrigen = localidade;
	}


	public MyListbox getCasetaPeajeList() {
		return casetaPeajeList;
	}


	public void setCasetaPeajeList(MyListbox casetaPeajeList) {
		this.casetaPeajeList = casetaPeajeList;
	}


	public List<CasetaPeaje> getLsCasetaPeaje() {
		return lsCasetaPeaje;
	}


	public void setLsCasetaPeaje(List<CasetaPeaje> lsCasetaPeaje) {
		this.lsCasetaPeaje = lsCasetaPeaje;
	}
	
	
	
	public ParadaSecuencia getParadaSeqDestino() {
		return paradaSeqDestino;
	}


	public void setParadaSeqDestino(ParadaSecuencia paradaSeqDestino) {
		this.paradaSeqDestino = paradaSeqDestino;
	}


	public MyComboboxEstandar getCmbTodasCasetasPeaje() {
		return cmbTodasCasetasPeaje;
	}


	public void setCmbTodasCasetasPeaje(MyComboboxEstandar cmbTodasCasetasPeaje) {
		this.cmbTodasCasetasPeaje = cmbTodasCasetasPeaje;
	}


	public List<CasetaPeaje> getLsTodasCasetasPeaje() {
		return lsTodasCasetasPeaje;
	}


	public void setLsTodasCasetasPeaje(List<CasetaPeaje> lsTodasCasetasPeaje) {
		this.lsTodasCasetasPeaje = lsTodasCasetasPeaje;
	}


	public String getLocalidadeDestino() {
		localidadeDestino = paradaSeqDestino.getParada().getCveparada()+" - "+paradaSeqDestino.getParada().getDescparada();
		return localidadeDestino;
	}


	public void setLocalidadeDestino(String localidadeDestino) {
		this.localidadeDestino = localidadeDestino;
	}


	@SuppressWarnings({ "unchecked", "rawtypes" })
	public void onClick$btnAdicionarCasetaPeaje(Event ev) throws InterruptedException {
		CasetaPeaje cas = (CasetaPeaje) cmbTodasCasetasPeaje.getSelectedItem().getValue();
		lsCasetaPeaje.add(cas);
//		CasetaPeaje caseta = new CasetaPeaje();
//		caseta.setCasetaPeajeId(1);
//		caseta.setDesccaseta("descricao");
//		caseta.setImporteIda(BigDecimal.valueOf(10));
//		caseta.setImporteVuelta(BigDecimal.valueOf(11));
//		lsCasetaPeaje.add(caseta);
		casetaPeajeList.setData(lsCasetaPeaje);
	}
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public void onClick$btnRemoverCasetaPeaje(Event ev) throws InterruptedException {
		CasetaPeaje cas = (CasetaPeaje)casetaPeajeList.getSelected();
		lsCasetaPeaje.remove(cas);
		casetaPeajeList.setData(lsCasetaPeaje);
	}
	
	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		List<RutaCaseta> lsrc = new ArrayList<RutaCaseta>() ;
		for(int i = 0 ; i < lsCasetaPeaje.size() ; i ++){
			RutaCaseta rc = new RutaCaseta();
			rc.setRutaSecuencia(lsRutaSecuencia.get(paradaSeqOrigen.getSecuencia()-1));
				if(i == 0){
					rc.getRutaSecuencia().setLsCasetaPeaje(new ArrayList<CasetaPeaje>());
				}
				rc.getRutaSecuencia().getLsCasetaPeaje().add(lsCasetaPeaje.get(i));
			rc.setCasetaPeaje(lsCasetaPeaje.get(i));
			lsrc.add(rc);
		}
		try {
			rutaCasetaService.deletarRutaCasetasFromRutaSecuenciaId(lsRutaSecuencia.get(paradaSeqOrigen.getSecuencia()-1).getRutasecuenciaId());
		} catch (BusinessException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		for(RutaCaseta rc : lsrc){
			try {
				rutaCasetaService.suscribir(rc);
				
				
			} catch (BusinessException e) {
				e.printStackTrace();
//				log.error("",ex);
	            Messagebox.show(
	                    Labels.getLabel("MSG.Error"),
	                    Labels.getLabel("editarSecuenciaController.window.title"),
	                    Messagebox.OK, Messagebox.ERROR);
			}
		}
		 Messagebox.show(
                 Labels.getLabel("editarSecuenciaController.MSG.suscribirOK"),
                 Labels.getLabel("editarSecuenciaController.window.title"),
                 Messagebox.OK, Messagebox.INFORMATION);

		 lsParadasSequencia.clear();
			
			short numSecuencia = 0;
			for (int i = 0; i < lsRutaSecuencia.size(); i++) {
				RutaSecuencia rs = lsRutaSecuencia.get(i);
				Tramo tramo = rs.getTramo();
				Via via = tramo.getVia();
				List<CasetaPeaje> lcas = rs.getLsCasetaPeaje();
				Short numsecuencia = ++numSecuencia;

				Parada paradaOrigem = tramo.getOrigem();
				addTramoPardaSecuencia(paradaOrigem, via, numsecuencia,lcas);
				if (i == lsRutaSecuencia.size() - 1) {
					Parada paradaDestino = tramo.getDestino();
					Integer ultSecuencia = numsecuencia.intValue() + 1;
					addTramoPardaSecuencia(paradaDestino, via,
							ultSecuencia.shortValue());
				}
			}

			rutaSecuenciaList.setData(lsParadasSequencia);
		 
		 
		 closeWindow();
	}


	public List<RutaSecuencia> getLsRutaSecuencia() {
		return lsRutaSecuencia;
	}


	public void setLsRutaSecuencia(List<RutaSecuencia> lsRutaSecuencia) {
		this.lsRutaSecuencia = lsRutaSecuencia;
	}


	public RutaCasetaService getRutaCasetaService() {
		return rutaCasetaService;
	}


	public void setRutaCasetaService(RutaCasetaService rutaCasetaService) {
		this.rutaCasetaService = rutaCasetaService;
	}


	public List<ParadaSecuencia> getLsParadasSequencia() {
		return lsParadasSequencia;
	}


	public void setLsParadasSequencia(List<ParadaSecuencia> lsParadasSequencia) {
		this.lsParadasSequencia = lsParadasSequencia;
	}


	public MyListbox getRutaSecuenciaList() {
		return rutaSecuenciaList;
	}


	public void setRutaSecuenciaList(MyListbox rutaSecuenciaList) {
		this.rutaSecuenciaList = rutaSecuenciaList;
	}
	private void addTramoPardaSecuencia(Parada parada, Via via, Short numsecuencia) {
		ParadaSecuencia paradaSecuencia = new ParadaSecuencia();
		paradaSecuencia.setParada(parada);
		paradaSecuencia.setSecuencia(numsecuencia);
		paradaSecuencia.setVia(via);
		lsParadasSequencia.add(paradaSecuencia);
	}
	private void addTramoPardaSecuencia(Parada parada, Via via, Short numsecuencia, List<CasetaPeaje> lCas) {
		ParadaSecuencia paradaSecuencia = new ParadaSecuencia();
		paradaSecuencia.setParada(parada);
		paradaSecuencia.setSecuencia(numsecuencia);
		paradaSecuencia.setVia(via);
		paradaSecuencia.setCasetas(lCas);
		lsParadasSequencia.add(paradaSecuencia);
	}
	
}
