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

import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
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.zul.Messagebox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Window;

import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.CoeficienteTarifaService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.TramoRutaService;
import com.rjconsultores.ventaboletos.service.ViaService;
import com.rjconsultores.ventaboletos.vo.esquemaoperacional.RutaTramoVO;
import com.rjconsultores.ventaboletos.web.gui.componente.esquemaoperacional.GridRutaTramoCoeficiente;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox;

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

	private static final long serialVersionUID = 1L;
	@Autowired
	private ViaService viaService;
	@Autowired
	private TramoRutaService tramoRutaService;
	@Autowired
	private RutaService rutaService;
	@Autowired
	private CoeficienteTarifaService coeficienteTarifaService;
	private RutaTramoVO rutaTramoIdaVO;
	private RutaTramoVO rutaTramoRegresoVO;
	private GridRutaTramoCoeficiente gridRutaSecuenciaIda;
	private GridRutaTramoCoeficiente gridRutaSecuenciaVolta;
	private Window winEditarTramoRuta;
	private MyTextbox txtNumRuta;
	private Radio radIda;
	private Radio radVolta;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		rutaTramoIdaVO = (RutaTramoVO) Executions.getCurrent().getArg().get("rutaTramoVO");
		winEditarTramoRuta = (Window) Executions.getCurrent().getArg().get("winEditarTramoRuta");
		super.doAfterCompose(comp);
		gridRutaSecuenciaIda.setClaseServicio(rutaTramoIdaVO.getClaseServicio());
		gridRutaSecuenciaIda.setOrgaoConcedente(rutaTramoIdaVO.getOrgaoConcedente());
		gridRutaSecuenciaIda.setLsVias(viaService.obtenerTodos());
		gridRutaSecuenciaIda.setLsCoeficientes(coeficienteTarifaService.obtenerTodos());
		gridRutaSecuenciaIda.agregarTodos(tramoRutaService.generarCombinacion(rutaTramoIdaVO));
		gridRutaSecuenciaVolta.setClaseServicio(rutaTramoIdaVO.getClaseServicio());
		gridRutaSecuenciaVolta.setOrgaoConcedente(rutaTramoIdaVO.getOrgaoConcedente());
		gridRutaSecuenciaVolta.setLsVias(viaService.obtenerTodos());
		gridRutaSecuenciaVolta.setLsCoeficientes(coeficienteTarifaService.obtenerTodos());
		if (rutaTramoIdaVO.getIndSentidoIda()) {
			radIda.setChecked(false);
			radVolta.setChecked(true);
		} else {
			radIda.setChecked(true);
			radVolta.setChecked(false);
		}
	}

	public void onClick$btnSalvar(Event e) throws InterruptedException {
		
		//Mantis 6970
		if (!validarRetorno()){
			return;
		}
		
		//Mantis 6970
		if (txtNumRuta.getValue().isEmpty()){
			int resp = Messagebox.show(Labels.getLabel("editarCombinacionTramoRutaController.MSG.generarRutaRegreso"),
					Labels.getLabel("editarCombinacionTramoRutaController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);
			
			if (resp == Messagebox.YES){
				return;
			}
		}
		
		rutaTramoIdaVO.setLsCombinacionRutaTramoVO(gridRutaSecuenciaIda.getLsSecuenciaRutaTramoCoeficienteVO());

		try {

			Ruta rutaIda = tramoRutaService.generarTramosRutas(rutaTramoIdaVO);

			if (rutaIda != null) {

				Messagebox.show(Labels.getLabel("editarCombinacionTramoRutaController.MSG.rutaIdaGenerada",
						new Object[] { rutaIda.getRutaId() + " - " + rutaIda.getDescruta() }),
						Labels.getLabel("editarCombinacionTramoRutaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);

				if (!gridRutaSecuenciaVolta.isEmpty()) {
					int resp = Messagebox.show(Labels.getLabel("editarCombinacionTramoRutaController.MSG.generarRutaRegreso"),
							Labels.getLabel("editarCombinacionTramoRutaController.window.title"),
							Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

					if (resp == Messagebox.YES) {
						rutaTramoRegresoVO.setLsCombinacionRutaTramoVO(gridRutaSecuenciaVolta.getLsSecuenciaRutaTramoCoeficienteVO());
						Ruta rutaRegresso = tramoRutaService.generarTramosRutas(rutaTramoRegresoVO);

						if (rutaRegresso != null) {
							Messagebox.show(Labels.getLabel("editarCombinacionTramoRutaController.MSG.rutaRegresoGenerada",
									new Object[] { rutaRegresso.getRutaId() + " - " + rutaRegresso.getDescruta() }),
									Labels.getLabel("editarCombinacionTramoRutaController.window.title"),
									Messagebox.OK, Messagebox.INFORMATION);
						}
					}
				}
			}

			winEditarTramoRuta.detach();
			this.closeWindow();
		} catch (BusinessException e1) {
			Messagebox.show(e1.getMessage(), Labels.getLabel("editarCombinacionTramoRutaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}

	}

	public void onClick$btnRutaRegreso(Event e) throws InterruptedException {
		txtNumRuta.getValue();
		boolean exists = false;
		rutaTramoIdaVO.setLsCombinacionRutaTramoVO(gridRutaSecuenciaIda.getLsSecuenciaRutaTramoCoeficienteVO());
		List<Ruta> listRuta = rutaService.buscarNumRuta(txtNumRuta.getValue());
		
		if (!listRuta.isEmpty()) {
			
			exists = CollectionUtils.exists(listRuta, new Predicate() {

				@Override
				public boolean evaluate(Object object) {
					return ((Ruta) object).getNumRuta().equals(txtNumRuta.getValue()) && ((Ruta) object).getIndSentidoIda().equals(radIda.isChecked());
				}
			});
		}
		
		if ((!listRuta.isEmpty() && exists) || (txtNumRuta.getValue().equals(rutaTramoIdaVO.getNumRuta()) && rutaTramoIdaVO.getIndSentidoIda().equals(radIda.isChecked()))) {

			Messagebox.show(
					Labels.getLabel("editarCatalogoDeRutaController.registroNumRutaExiste"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;

		}

		rutaTramoRegresoVO = tramoRutaService.generarRutaRegreso(rutaTramoIdaVO);
		rutaTramoRegresoVO.setNumRuta(txtNumRuta.getValue());

		gridRutaSecuenciaVolta.agregarTodos(rutaTramoRegresoVO.getLsCombinacionRutaTramoVO());

	}
	
	private boolean validarRetorno() throws InterruptedException{
		
		if (!txtNumRuta.getValue().isEmpty() && (gridRutaSecuenciaVolta.isEmpty())){
			Messagebox.show(
					Labels.getLabel("editarCatalogoDeRutaController.msg.combinacaoNaoRealizada"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
	
			return false;
		}
		
		return true;
	}
}
