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

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

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
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.zk.ui.event.InputEvent;
import org.zkoss.zkplus.databind.BindingListModelList;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;

import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.CoeficienteTarifa;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.Moneda;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Plaza;
import com.rjconsultores.ventaboletos.entidad.RegionMetropolitana;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.TarifaMinima;
import com.rjconsultores.ventaboletos.entidad.TarifaMinimaCategoria;
import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa;
import com.rjconsultores.ventaboletos.service.CategoriaService;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.CoeficienteTarifaService;
import com.rjconsultores.ventaboletos.service.MarcaService;
import com.rjconsultores.ventaboletos.service.MonedaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.PlazaService;
import com.rjconsultores.ventaboletos.service.RegionMetropolitanaService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.TarifaMinimaService;
import com.rjconsultores.ventaboletos.service.VigenciaTarifaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MensagensUtils;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextboxDecimal;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderTarifaMinimaCategoria;

/**
 *
 * @author rodrigo
 */
@Controller("editarTarifaMinimaController")
@Scope("prototype")
public class EditarTarifaMinimaController extends MyGenericForwardComposer {

	private static final String MSG_ERROR = "MSG.Error";

	private static final String TITULO_TARIFA_MINIMA = "editarTarifaMinimaController.window.title";

	private static final long serialVersionUID = 1L;

	@Autowired
    private TarifaMinimaService tarifaMinimaService;
    @Autowired
    private MarcaService marcaService;
    @Autowired
    private ClaseServicioService claseServicioService;
    @Autowired
    private PlazaService plazaService;
    @Autowired
    private MonedaService monedaService;
    @Autowired
	private OrgaoConcedenteService orgaoConcedenteService;
    @Autowired
	private CategoriaService categoriaService;
    @Autowired
	private VigenciaTarifaService vigenciaTarifaService;
    @Autowired
	private RutaService rutaService;
    @Autowired
    private RegionMetropolitanaService regionMetropolitanaService;
    @Autowired
    private CoeficienteTarifaService coeficienteTarifaService;
    
    private List<Moneda> lsMoneda;
    private List<Marca> lsMarcas;
    private List<ClaseServicio> lsClaseServico;
    private List<Plaza> lsPlaza;
    private List<RegionMetropolitana> lsRegionMetropolitana;
    private MyListbox tarifaMinimaList;
    private Combobox cmbMarca;
    private MyComboboxParada cmbOrigem;
    private MyComboboxParada cmbDestino;
    private Combobox cmbClaseServicio;
    private Combobox cmbMoneda;
    private Combobox cmbPlaza;
    private Combobox cmbOrgaoConcedente;
    private TarifaMinima tarifaMinima;
    private Button btnApagar;
    private MyTextboxDecimal txtImportancia;
    private List<OrgaoConcedente> lsOrgaoConcedente;
    private static Logger log = LogManager.getLogger(EditarTarifaMinimaController.class);

    private List<Categoria> lsCategorias;
    private MyComboboxEstandar cmbCategorias;
    private MyListbox tarifaMinimaCategoriaList;
	private Combobox cmbVigencia;
	private MyComboboxEstandar cmbRegionMetropolitana;
	private Combobox cmbCoeficienteTarifa;
	private List<VigenciaTarifa> lsVigenciaTarifa;
	private List<Ruta> lsRuta;
	private List<CoeficienteTarifa> lsCoeficienteTarifa;

	private Combobox cmbRuta;

    @Override
    public void doAfterCompose(Component comp) throws Exception {
        super.doAfterCompose(comp);

        tarifaMinima = (TarifaMinima) Executions.getCurrent().getArg().get("tarifaMinima");
        tarifaMinimaList = (MyListbox) Executions.getCurrent().getArg().get("tarifaMinimaList");

        lsCategorias = categoriaService.obtenerTodos();
        lsOrgaoConcedente = orgaoConcedenteService.obtenerTodos();
        lsMoneda = monedaService.obtenerTodos();
        lsMarcas = marcaService.buscarMarcaPorEmpresa(UsuarioLogado.getUsuarioLogado().getEmpresa());
        lsClaseServico = claseServicioService.obtenerTodos();
        lsPlaza = plazaService.obtenerTodos();
        lsRegionMetropolitana = regionMetropolitanaService.obtenerTodos();
        lsCoeficienteTarifa = coeficienteTarifaService.obtenerTodos();
        
        lsVigenciaTarifa = new ArrayList<VigenciaTarifa>();
		lsVigenciaTarifa.add(null);
		lsVigenciaTarifa.addAll(vigenciaTarifaService.obtenerTodos());

        if (tarifaMinima.getTarifaminimaId() == null) {
            btnApagar.setVisible(Boolean.FALSE);
        } else {
        	tarifaMinima = tarifaMinimaService.obtenerID(tarifaMinima.getTarifaminimaId());
        }
        txtImportancia.focus();
        
        tarifaMinimaCategoriaList.setItemRenderer(new RenderTarifaMinimaCategoria());
        if(tarifaMinima.getTarifaMinimaCategorias() != null) {
        	tarifaMinimaCategoriaList.setData(tarifaMinima.getTarifaMinimaCategorias());
        }
        
        llenarRutasPorClase();
    }
    
    public void onChange$cmbClaseServicio(InputEvent ev) {
		if (ev.isChangingBySelectBack()) {
			return;
		}

		llenarRutasPorClase();
	}
    
    public void onChange$cmbRegionMetropolitana(InputEvent ev) {
    	if (ev.isChangingBySelectBack()) {
    		return;
    	}
    	
    	tarifaMinima.setCoeficienteTarifa(null);
    	cmbCoeficienteTarifa.setSelectedItem(null);
    	tarifaMinima.setOrigem(null);
    	cmbOrigem.setSelectedItem(null);
    	tarifaMinima.setDestino(null);
    	cmbDestino.setSelectedItem(null);
    }
    
    public void onChange$cmbOrigem(InputEvent ev) {
    	if (ev.isChangingBySelectBack()) {
    		return;
    	}
    	
    	cmbRegionMetropolitana.setSelectedItem(null);
    }
    
    public void onChange$cmbDestino(InputEvent ev) {
    	if (ev.isChangingBySelectBack()) {
    		return;
    	}
    	
    	cmbRegionMetropolitana.setSelectedItem(null);
    }
    
    public void onChange$cmbCoeficienteTarifa(InputEvent ev) {
    	if (ev.isChangingBySelectBack()) {
    		return;
    	}
    	
    	tarifaMinima.setRegionMetropolitana(null);
    	cmbRegionMetropolitana.setSelectedItem(null);
    }

    public void onClick$btnSalvar(Event ev) throws InterruptedException {
    	txtImportancia.getValue();
        cmbMoneda.getValue();
        cmbPlaza.getValue();
        cmbMarca.getValue();
        cmbClaseServicio.getValue();
        cmbOrgaoConcedente.getValue();
        tarifaMinima.setFecmodif(Calendar.getInstance().getTime());
        tarifaMinima.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
        tarifaMinima.setActivo(Boolean.TRUE);

        Comboitem cbiRuta = cmbRuta.getSelectedItem();
		Ruta ruta = null;
		if (cbiRuta != null) {
			ruta = (Ruta) cbiRuta.getValue();
		}
		tarifaMinima.setRuta(ruta);
		
		Comboitem cbiVigenciaTarifa = cmbVigencia.getSelectedItem();
		VigenciaTarifa vigenciaTarifa = null;
		if (cbiVigenciaTarifa != null) {
			vigenciaTarifa = (VigenciaTarifa) cbiVigenciaTarifa.getValue();
		}
		tarifaMinima.setVigenciaTarifa(vigenciaTarifa);
		
		Comboitem cbiRegionMetropolitana = cmbRegionMetropolitana.getSelectedItem();
		RegionMetropolitana regionMetropolitana = null;
		if (cbiRegionMetropolitana != null) {
			regionMetropolitana = (RegionMetropolitana) cbiRegionMetropolitana.getValue();
		}
		tarifaMinima.setRegionMetropolitana(regionMetropolitana);
		
		Comboitem cbiCoeficienteTarifa = cmbCoeficienteTarifa.getSelectedItem();
		CoeficienteTarifa coeficienteTarifa = null;
		if (cbiCoeficienteTarifa != null) {
			coeficienteTarifa = (CoeficienteTarifa) cbiCoeficienteTarifa.getValue();
		}
		tarifaMinima.setCoeficienteTarifa(coeficienteTarifa);

        try {
			if (isCamposObrigatoriosValidos()) {
				if (tarifaMinima.getTarifaminimaId() == null) {
					salvarNovaTarifa();
				} else {
					salvarEdicaoTarifa();
				}
			}
        } catch (Exception ex) {
            log.error("Editar tarifa minimas: " , ex);
            MensagensUtils.showMessageError(MSG_ERROR, TITULO_TARIFA_MINIMA);
        }
        
    }

	private boolean isCamposObrigatoriosValidos() {
		if (tarifaMinima.getOrgaoConcedente() == null) {
			MensagensUtils.showMessageExclamation("editarTarifaMinimaController.btnFechar.MSG.orgao", TITULO_TARIFA_MINIMA);
			return false;
		}
		if (tarifaMinima.getMoneda() == null) {
			MensagensUtils.showMessageExclamation("editarTarifaMinimaController.btnFechar.MSG.moneda", TITULO_TARIFA_MINIMA);
			return false;
		}
		if (tarifaMinima.getPlaza() == null) {
			MensagensUtils.showMessageExclamation("editarTarifaMinimaController.btnFechar.MSG.plaza", TITULO_TARIFA_MINIMA);
			return false;
		}
		if (tarifaMinima.getMarca() == null) {
			MensagensUtils.showMessageExclamation("editarTarifaMinimaController.btnFechar.MSG.marca", TITULO_TARIFA_MINIMA);
			return false;
		}
		if (tarifaMinima.getOrigem() == null 
				&& tarifaMinima.getDestino() == null 
				&& tarifaMinima.getRegionMetropolitana() == null) {
			MensagensUtils.showMessageExclamation("editarTarifaMinimaController.btnFechar.MSG.parada", TITULO_TARIFA_MINIMA);
			return false;
		}
		if (tarifaMinima.getClaseServicio() == null) {
			MensagensUtils.showMessageExclamation("editarTarifaMinimaController.btnFechar.MSG.tipo", TITULO_TARIFA_MINIMA);
			return false;
		}
		return true;
	}

	private void salvarEdicaoTarifa() {
		tarifaMinimaService.actualizacion(tarifaMinima);
		tarifaMinimaList.updateItem(tarifaMinima);
		salvarTarifaMinimaCategoria();
		MensagensUtils.showMessageInformation("editarTarifaMinimaController.btnFechar.MSG.SuscbrirOK", TITULO_TARIFA_MINIMA);
		closeWindow();
	}

	private void salvarNovaTarifa() {
		List<TarifaMinima> listaTarifaMinima = tarifaMinimaService.pesquisar(tarifaMinima);
		if (listaTarifaMinima.isEmpty()) {
			tarifaMinimaService.suscribir(tarifaMinima);
			tarifaMinimaList.addItemNovo(tarifaMinima);
			salvarTarifaMinimaCategoria();
			MensagensUtils.showMessageInformation("editarTarifaMinimaController.btnFechar.MSG.SuscbrirOK", TITULO_TARIFA_MINIMA);
			closeWindow();
		} else {
			MensagensUtils.showMessageExclamation("MSG.Registro.Existe", TITULO_TARIFA_MINIMA);
		}
	}

    public void onClick$btnApagar(Event ev) {
        tarifaMinima.setFecmodif(Calendar.getInstance().getTime());
        tarifaMinima.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
        tarifaMinima.setActivo(Boolean.FALSE);

        try {
            int opcao = MensagensUtils.showMessageQuestion("editarTarifaMinimaController.btnFechar.MSG.Deseja.Borrar", TITULO_TARIFA_MINIMA);

            if (opcao == Messagebox.YES) {
                tarifaMinimaService.borrar(tarifaMinima);
                tarifaMinimaList.removeItem(tarifaMinima);
                MensagensUtils.showMessageInformation("editarTarifaMinimaController.btnFechar.MSG.borrarOK", TITULO_TARIFA_MINIMA);
                closeWindow();
            }
        } catch (Exception ex) {
            log.error("", ex);
        }
    }
    
    public void onClick$btnAdicionarCategoria(Event ev) throws InterruptedException {
    	try {
			
			Categoria categoria = (Categoria) (cmbCategorias.getSelectedItem() != null ? cmbCategorias.getSelectedItem().getValue() : null);
			
			if(categoria != null) {
				TarifaMinimaCategoria tarifaMinimaCategoria = new TarifaMinimaCategoria();
				tarifaMinimaCategoria.setCategoria(categoria);
				tarifaMinimaCategoria.setTarifaMinima(tarifaMinima);

				tarifaMinimaCategoriaList.updateItem(tarifaMinimaCategoria);
			
				MensagensUtils.showMessageInformation("editarTarifaMinimaController.msg.adicionarTarifaMinimaCategoria", TITULO_TARIFA_MINIMA);
			}

		} catch (Exception e) {
			log.error(e.getMessage(), e);
			MensagensUtils.showMessageError(MSG_ERROR, TITULO_TARIFA_MINIMA);
		}    	
    }

    public void onClick$btnRemoverCategoria(Event ev) throws InterruptedException {
    	try {
			if(tarifaMinimaCategoriaList.getSelected() != null) {
				int resp = MensagensUtils.showMessageQuestion("editarTarifaMinimaController.msg.removerTarifaMinimaCategoriaPergunta", TITULO_TARIFA_MINIMA);
	
				if (resp == Messagebox.YES) {
					TarifaMinimaCategoria tarifaMinimaCategoria = (TarifaMinimaCategoria) tarifaMinimaCategoriaList.getSelected();
					tarifaMinimaCategoriaList.removeItem(tarifaMinimaCategoria);
					
					MensagensUtils.showMessageInformation("editarTarifaMinimaController.msg.removerTarifaMinimaCategoria", TITULO_TARIFA_MINIMA);
				}
			}
			
		} catch (Exception e) {
			log.error(e.getMessage(), e);
			MensagensUtils.showMessageError(MSG_ERROR, TITULO_TARIFA_MINIMA);
		}
    }
    
    private void llenarRutasPorClase() {
		if (tarifaMinima.getClaseServicio() == null) {
			return;
		}
		cmbMarca.setConstraint("");
		if (cmbMarca.getSelectedItem() == null) {
			lsRuta = rutaService.buscarPorClaseServicio(tarifaMinima.getClaseServicio());
		} else {
			lsRuta = rutaService.buscarPorClaseServicioEmpresa(tarifaMinima.getClaseServicio(), ((Marca) cmbMarca.getSelectedItem().getValue()).getEmpresa());
		}
		cmbMarca.setConstraint("no empty");

		// caso o usuario tenha mudado a classeServicio da ruta
		if (tarifaMinima.getTarifaminimaId() != null && tarifaMinima.getRuta() != null && !lsRuta.contains(tarifaMinima.getRuta())) {
			lsRuta.add(tarifaMinima.getRuta());
		}

		BindingListModelList l = new BindingListModelList(lsRuta, true);
		cmbRuta.setModel(l);
	}
    
	private void salvarTarifaMinimaCategoria() {
		//Remove todas categorias salvas e insere de acordo com o escolhido para salvar
		@SuppressWarnings("unchecked")
		List<TarifaMinimaCategoria> tarifaMinimaCategoriaSalva = (List<TarifaMinimaCategoria>) (tarifaMinima.getTarifaMinimaCategorias()  == null ? tarifaMinimaCategoriaList.getModel() : tarifaMinima.getTarifaMinimaCategorias());
		for (TarifaMinimaCategoria tarifaMinimaCategoria : tarifaMinimaCategoriaSalva) {
			tarifaMinimaService.removerTarifaMinimaCategoria(tarifaMinimaCategoria);
		}
		for (int i = 0; i < tarifaMinimaCategoriaList.getModel().getSize(); i++) {
			TarifaMinimaCategoria tarifaMinimaCategoria = (TarifaMinimaCategoria) tarifaMinimaCategoriaList.getModel().getElementAt(i);
			tarifaMinimaCategoria = tarifaMinimaService.adicionarTarifaMinimaCategoria(tarifaMinimaCategoria);
		}
	}

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

	public void setLsOrgaoConcedente(List<OrgaoConcedente> lsOrgaoConcedente) {
		this.lsOrgaoConcedente = lsOrgaoConcedente;
	}

	public List<Categoria> getLsCategorias() {
		return lsCategorias;
	}

	public void setLsCategorias(List<Categoria> lsCategorias) {
		this.lsCategorias = lsCategorias;
	}
	
	public Boolean isTarifaMinimaSalva() {
		return getTarifaMinima().getTarifaminimaId() != null;
	}

	public Combobox getCmbVigencia() {
		return cmbVigencia;
	}

	public void setCmbVigencia(Combobox cmbVigencia) {
		this.cmbVigencia = cmbVigencia;
	}

	public List<VigenciaTarifa> getLsVigenciaTarifa() {
		return lsVigenciaTarifa;
	}

	public void setLsVigenciaTarifa(List<VigenciaTarifa> lsVigenciaTarifa) {
		this.lsVigenciaTarifa = lsVigenciaTarifa;
	}

	public List<RegionMetropolitana> getLsRegionMetropolitana() {
		return lsRegionMetropolitana;
	}

	public void setLsRegionMetropolitana(List<RegionMetropolitana> lsRegionMetropolitana) {
		this.lsRegionMetropolitana = lsRegionMetropolitana;
	}

	public List<Ruta> getLsRuta() {
		return lsRuta;
	}

	public void setLsRuta(List<Ruta> lsRuta) {
		this.lsRuta = lsRuta;
	}

	public Combobox getCmbRuta() {
		return cmbRuta;
	}

	public void setCmbRuta(Combobox cmbRuta) {
		this.cmbRuta = cmbRuta;
	}
	
    public List<Moneda> getLsMoneda() {
        return lsMoneda;
    }

    public void setLsMoneda(List<Moneda> lsMoneda) {
        this.lsMoneda = lsMoneda;
    }

    public List<Plaza> getLsPlaza() {
        return lsPlaza;
    }

    public void setLsPlaza(List<Plaza> lsPlaza) {
        this.lsPlaza = lsPlaza;
    }

    public Combobox getCmbClaseServicio() {
        return cmbClaseServicio;
    }

    public void setCmbClaseServicio(Combobox cmbClaseServicio) {
        this.cmbClaseServicio = cmbClaseServicio;
    }

    public Combobox getCmbMarca() {
        return cmbMarca;
    }

    public void setCmbMarca(Combobox cmbMarca) {
        this.cmbMarca = cmbMarca;
    }

    public Combobox getCmbOrigem() {
        return cmbOrigem;
    }

    public MyComboboxParada getCmbDestino() {
        return cmbDestino;
    }

    public void setCmbDestino(MyComboboxParada cmbDestino) {
        this.cmbDestino = cmbDestino;
    }

    public void setCmbOrigem(MyComboboxParada cmbOrigem) {
        this.cmbOrigem = cmbOrigem;
    }

    public List<ClaseServicio> getLsClaseServico() {
        return lsClaseServico;
    }

    public void setLsClaseServico(List<ClaseServicio> lsClaseServico) {
        this.lsClaseServico = lsClaseServico;
    }

    public List<Marca> getLsMarcas() {
        return lsMarcas;
    }

    public void setLsMarcas(List<Marca> lsMarcas) {
        this.lsMarcas = lsMarcas;
    }

    public TarifaMinima getTarifaMinima() {
        return tarifaMinima;
    }

    public void setTarifaMinima(TarifaMinima tarifaMinima) {
        this.tarifaMinima = tarifaMinima;
    }

    public Button getBtnApagar() {
        return btnApagar;
    }

    public void setBtnApagar(Button btnApagar) {
        this.btnApagar = btnApagar;
    }

    public Combobox getCmbMoneda() {
        return cmbMoneda;
    }

    public void setCmbMoneda(Combobox cmbMoneda) {
        this.cmbMoneda = cmbMoneda;
    }

    public Combobox getCmbPlaza() {
        return cmbPlaza;
    }

    public void setCmbPlaza(Combobox cmbPlaza) {
        this.cmbPlaza = cmbPlaza;
    }

    public Combobox getCmbOrgaoConcedente() {
		return cmbOrgaoConcedente;
	}

	public void setCmbOrgaoConcedente(Combobox cmbOrgaoConcedente) {
		this.cmbOrgaoConcedente = cmbOrgaoConcedente;
	}

	public MyListbox getTarifaMinimaList() {
        return tarifaMinimaList;
    }

    public void setTarifaMinimaList(MyListbox tarifaMinimaList) {
        this.tarifaMinimaList = tarifaMinimaList;
    }

    public TarifaMinimaService getTarifaMinimaService() {
        return tarifaMinimaService;
    }

    public void setTarifaMinimaService(TarifaMinimaService tarifaMinimaService) {
        this.tarifaMinimaService = tarifaMinimaService;
    }

    public MyTextboxDecimal getTxtImportancia() {
        return txtImportancia;
    }

    public void setTxtImportancia(MyTextboxDecimal txtImportancia) {
        this.txtImportancia = txtImportancia;
    }

	public Combobox getCmbRegionMetropolitana() {
		return cmbRegionMetropolitana;
	}

	public void setCmbRegionMetropolitana(MyComboboxEstandar cmbRegionMetropolitana) {
		this.cmbRegionMetropolitana = cmbRegionMetropolitana;
	}

	public List<CoeficienteTarifa> getLsCoeficienteTarifa() {
		return lsCoeficienteTarifa;
	}

	public void setLsCoeficienteTarifa(List<CoeficienteTarifa> lsCoeficienteTarifa) {
		this.lsCoeficienteTarifa = lsCoeficienteTarifa;
	}
}
