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

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 org.zkoss.zul.Window;

import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.ParadaSecuencia;
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.vo.esquemaoperacional.SecuenciaRutaTramoCoeficienteVO;
import com.rjconsultores.ventaboletos.vo.esquemaoperacional.SecuenciaRutaTramoVO;
import com.rjconsultores.ventaboletos.web.gui.componente.esquemaoperacional.GridCombinacionTramoRutaCoeficiente;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;

@Controller("gerarCombinacionTramoRutaController")
@Scope("prototype")
public class GerarCombinacionTramoRutaController 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 Ruta ruta;
	private Ruta rutaClone;
	private MyListbox rutaList;
	private List<ParadaSecuencia> lsSequencias;
	private GridCombinacionTramoRutaCoeficiente gridRutaSecuenciaIda;
	private Window winEditarRuta;
	private ClaseServicio clase;

	@SuppressWarnings("unchecked")
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		rutaTramoIdaVO = (RutaTramoVO) Executions.getCurrent().getArg().get("rutaTramoVO");
		ruta = (Ruta) Executions.getCurrent().getArg().get("ruta");
		rutaClone = (Ruta) Executions.getCurrent().getArg().get("rutaClone");
		clase = (ClaseServicio) Executions.getCurrent().getArg().get("clase");
		rutaList = (MyListbox) Executions.getCurrent().getArg().get("rutaList");
		lsSequencias = (List<ParadaSecuencia>) Executions.getCurrent().getArg().get("lsSequencias");
		winEditarRuta = (Window) Executions.getCurrent().getArg().get("winEditarRuta");
		super.doAfterCompose(comp);
		List<SecuenciaRutaTramoCoeficienteVO> listaSecuenciaRutaTramoCoeficiente = tramoRutaService.generarCombinacionTrechoRuta(rutaTramoIdaVO, lsSequencias);

		if (rutaTramoIdaVO.getCoeficienteDefault1() != null 
				|| rutaTramoIdaVO.getCoeficienteDefault2() != null
				|| rutaTramoIdaVO.getCoeficienteDefault3() != null) {
			for (SecuenciaRutaTramoCoeficienteVO sv : listaSecuenciaRutaTramoCoeficiente) {
				sv.setCoeficienteTarifa1(rutaTramoIdaVO.getCoeficienteDefault1());
				sv.setCoeficienteTarifa2(rutaTramoIdaVO.getCoeficienteDefault2());
				sv.setCoeficienteTarifa3(rutaTramoIdaVO.getCoeficienteDefault3());
			}
		}
		gridRutaSecuenciaIda.setClaseServicio(rutaTramoIdaVO.getClaseServicio());
		gridRutaSecuenciaIda.setOrgaoConcedente(rutaTramoIdaVO.getOrgaoConcedente());
		gridRutaSecuenciaIda.setLsVias(viaService.obtenerTodos());
		gridRutaSecuenciaIda.setLsCoeficientes(coeficienteTarifaService.obtenerTodos());
		gridRutaSecuenciaIda.agregarTodos(listaSecuenciaRutaTramoCoeficiente);
	}

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

		rutaTramoIdaVO.setLsCombinacionRutaTramoVO(gridRutaSecuenciaIda.getLsSecuenciaRutaTramoCoeficienteVO());
		rutaTramoIdaVO.setLsSecuenciaRutaTramoVO(popularSequencia());

		try {
			Ruta rutaDB = rutaClone == null ? ruta : rutaClone;
			rutaDB.setClaseServicio(clase);
			
			if (rutaDB.getRutaId() == null) {
				if(!ruta.getIsClone()){
				rutaDB.setIsCadastro(true);
				}
				rutaDB = salvarNovaRuta(rutaDB);	
			}
			
			tramoRutaService.generarTramosRutaExistente(rutaTramoIdaVO, rutaDB);
			
			rutaDB = atualizarRuta(rutaDB);
			
			Messagebox.show(Labels.getLabel(
					"editarCatalogoDeRutaController.MSG.suscribirOK").concat(" ID: "
							+ rutaDB.getRutaId().toString()),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.OK,
					Messagebox.INFORMATION);
			
			winEditarRuta.detach();
			this.closeWindow();

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

	private List<SecuenciaRutaTramoVO> popularSequencia() {
		List<SecuenciaRutaTramoVO> lsSecuenciaRutaTramoVO = new ArrayList<SecuenciaRutaTramoVO>();

		for (SecuenciaRutaTramoCoeficienteVO secuencia : gridRutaSecuenciaIda.getLsSecuenciaRutaTramoCoeficienteVO()) {

			SecuenciaRutaTramoVO secuenciaRutaTramoVO = new SecuenciaRutaTramoVO(secuencia.getOrigen(), secuencia.getDestino(),
					secuencia.getVia(), secuencia.getSecuencia(), secuencia.getKmReal(), secuencia.getTiempoRecorrido());

			lsSecuenciaRutaTramoVO.add(secuenciaRutaTramoVO);
		}

		return lsSecuenciaRutaTramoVO;
	}

	private Ruta salvarNovaRuta(Ruta rutaDB) throws BusinessException, InterruptedException {
		rutaDB = rutaService.suscribir(rutaDB, lsSequencias);
		rutaList.addItemNovo(rutaDB);

		return rutaDB;
	}

	private Ruta atualizarRuta(Ruta rutaDB) throws BusinessException, InterruptedException {
		rutaDB = rutaService.actualizacion(rutaDB, lsSequencias);
		rutaList.updateItem(rutaDB);
		
		return rutaDB;
	}
}
