/*
 * 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.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

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.event.Event;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Window;

import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.TramoRutaService;
import com.rjconsultores.ventaboletos.service.UsuarioEmpresaService;
import com.rjconsultores.ventaboletos.service.ViaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.vo.esquemaoperacional.RutaTramoVO;
import com.rjconsultores.ventaboletos.web.gui.componente.esquemaoperacional.GridRutaTramo;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox;

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

    private static final long serialVersionUID = 1L;
    @Autowired
    private ViaService viaService;
    @Autowired
    private ClaseServicioService claseServicioService;
    @Autowired
    private TramoRutaService tramoRutaService;
    @Autowired
	private RutaService rutaService;
    @Autowired
    private EmpresaService empresaService;
    @Autowired
	private UsuarioEmpresaService usuarioEmpresaService;
    @Autowired
    private OrgaoConcedenteService orgaoConcedenteService;
    private List<OrgaoConcedente> lsOrgaoConcedente;
    private List<ClaseServicio> lsClaseServicio;
    private List<Empresa> lsEmpresa;
    private Combobox cmbClaseServicio;
    private Combobox cmbOrgaoConcedente;
    private Checkbox chkSolicitaNombrePasajero;
    private MyTextbox txtDscRuta;
    private Window winEditarTramoRuta;
    private Combobox cmbEmpresa;
    private MyListbox rutaEmpresaList;
    private GridRutaTramo gridRutaSecuencia;
    private List<Empresa> lsRutaEmpresa;
    private MyTextbox txtPrefixo;
    private Radio radVolta;
    private Radio radIda;
    private MyTextbox txtNumRuta;

    @Override
    public void doAfterCompose(Component comp) throws Exception {
        lsOrgaoConcedente = orgaoConcedenteService.obtenerTodos();
        lsEmpresa =  UsuarioLogado.getUsuarioLogado().getEmpresa();
        lsRutaEmpresa = new ArrayList<Empresa>();
        super.doAfterCompose(comp);
        gridRutaSecuencia.setPrimeiraVia(true);
        NuevaParadaController.via = null;
        gridRutaSecuencia.setLsVias(viaService.obtenerTodos());
    }
    
    public void onSelect$cmbEmpresa(Event e)throws InterruptedException {
    	cmbClaseServicio.setModel(null);
    	lsRutaEmpresa.clear();
    	
    	List<Empresa> empresas = new ArrayList<Empresa>();
    	Empresa empresa = (Empresa)cmbEmpresa.getSelectedItem().getValue();
    	empresas.add(empresa);
    	
    	lsClaseServicio = claseServicioService.buscarPorEmpresasDoUsuario(empresas);
    	
    	if (lsClaseServicio == null || lsClaseServicio.size() == 0){
    		
    		cmbEmpresa.setSelectedItem(null);
    		    		
    		Messagebox.show(
					Labels.getLabel("editarTramoRutaController.msg.tipoClasseNaoEncontrado"),
					Labels.getLabel("editarTramoRutaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

    		return;
    	}
    	
    	cmbClaseServicio.setModel(new ListModelList(lsClaseServicio));
    	lsRutaEmpresa.add(empresa);
    }

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

    	List<Ruta> lsRuta = rutaService.buscarNumRuta(txtNumRuta.getValue());
    	RutaTramoVO rutaTramoVO = new RutaTramoVO();
    	if (radIda.isChecked()) {
    		rutaTramoVO.setIndSentidoIda(Boolean.TRUE);
    	} else if (radVolta.isChecked()) {
    		rutaTramoVO.setIndSentidoIda(Boolean.FALSE);
    	}
		if (!lsRuta.isEmpty()) {
			
			boolean exists = CollectionUtils.exists(lsRuta, new Predicate() {

				@Override
				public boolean evaluate(Object object) {
					return ((Ruta) object).getNumRuta().equals(txtNumRuta.getValue()) && ((Ruta) object).getIndSentidoIda().equals(radIda.isChecked());
				}
			});

			if (exists) {
				Messagebox.show(
						Labels.getLabel("editarTramoRutaController.registroNumRutaExiste"),
						Labels.getLabel("editarTramoRutaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);

				return;
			}
			
		}		
    	
    	if (gridRutaSecuencia.isEmpty()){
    		Messagebox.show(Labels.getLabel("editarTramoRutaController.msg.trechoObligatoria"),
                    Labels.getLabel("editarTramoRutaController.window.title"), Messagebox.OK,
                    Messagebox.INFORMATION);
            return;
    	}
    	
        rutaTramoVO.setClaseServicio((ClaseServicio) cmbClaseServicio.getSelectedItem().getValue());
        rutaTramoVO.setOrgaoConcedente((OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue());
        rutaTramoVO.setSolicitaNombrePasajero(chkSolicitaNombrePasajero.isChecked());
        rutaTramoVO.setLsSecuenciaRutaTramoVO(gridRutaSecuencia.getLsSecuenciaRutaTramoVO());
        rutaTramoVO.setLsEmpresa(lsRutaEmpresa);
        rutaTramoVO.setPrefixo(txtPrefixo.getValue());
        rutaTramoVO.setDescRuta(txtDscRuta.getValue());
        rutaTramoVO.setNumRuta(txtNumRuta.getValue());
        
        Map<String, Object> params = new LinkedHashMap<String, Object>();
        params.put("rutaTramoVO", rutaTramoVO);
        params.put("winEditarTramoRuta", winEditarTramoRuta);

        this.openWindow("/gui/esquema_operacional/generacion_tramo_ruta/editarCombinacionTramoRuta.zul",
                Labels.getLabel("editarCombinacionTramoRutaController.window.title"), params, MODAL);

    }

    public void onClick$btnAgregarPaso(Event e) {
        cmbClaseServicio.getValue();
        cmbOrgaoConcedente.getValue();
        Map<String, Object> params = new LinkedHashMap<String, Object>();
        params.put("gridRutaSecuencia", gridRutaSecuencia);
        params.put("origen", gridRutaSecuencia.getUltimaParada());
        params.put("txtDscRuta", txtDscRuta);

        this.openWindow("/gui/esquema_operacional/generacion_tramo_ruta/nuevaParada.zul",
                Labels.getLabel("nuevaParadaController.window.title"), params, MODAL);
    }

    public List<ClaseServicio> getLsClaseServicio() {
        return lsClaseServicio;
    }
    
    public void onChange$cmbClaseServicio(Event e) {
        gridRutaSecuencia.setClaseServicio((ClaseServicio) cmbClaseServicio.getSelectedItem().getValue());
    }

    public List<OrgaoConcedente> getLsOrgaoConcedente() {
        return lsOrgaoConcedente;
    }

    
    public void onClick$btnDebugCombinacion(Event e) {
        RutaTramoVO rutaTramoVO = new RutaTramoVO();
        rutaTramoVO.setClaseServicio((ClaseServicio) cmbClaseServicio.getSelectedItem().getValue());
        rutaTramoVO.setOrgaoConcedente((OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue());
        rutaTramoVO.setSolicitaNombrePasajero(chkSolicitaNombrePasajero.isChecked());
        rutaTramoVO.setLsSecuenciaRutaTramoVO(gridRutaSecuencia.getLsSecuenciaRutaTramoVO());
        
        if (radIda.isChecked()) {
        	rutaTramoVO.setIndSentidoIda(true);
		} else if (radVolta.isChecked()) {
			rutaTramoVO.setIndSentidoIda(false);
		}
        tramoRutaService.generarCombinacion(rutaTramoVO);
    }

    public List<Empresa> getLsEmpresa() {
        return lsEmpresa;
    }

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

        Comboitem cbiEmpresa = cmbEmpresa.getSelectedItem();

        if (cbiEmpresa != null) {
            Empresa empresa = (Empresa) cbiEmpresa.getValue();

            if (!lsRutaEmpresa.contains(empresa)) {
                lsRutaEmpresa.add(empresa);
                rutaEmpresaList.setData(lsRutaEmpresa);
            } else {
                Messagebox.show(Labels.getLabel("MSG.Registro.Existe"),
                        Labels.getLabel("editarTramoRutaController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
            }
        }

    }

    public void onClick$btnRemoverEmpresaRuta(Event ev) {
        Empresa rutaEmpresa = (Empresa) rutaEmpresaList.getSelected();
        if (rutaEmpresa != null) {
            lsRutaEmpresa.remove(rutaEmpresa);
            rutaEmpresaList.setData(lsRutaEmpresa);
        }
    }
}
