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

import org.apache.log4j.Logger;
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.Button;
import org.zkoss.zul.Combobox;

import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
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.TarifaMinima;
import com.rjconsultores.ventaboletos.entidad.TarifaMinimaCategoria;
import com.rjconsultores.ventaboletos.service.CategoriaService;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.MarcaService;
import com.rjconsultores.ventaboletos.service.MonedaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.service.PlazaService;
import com.rjconsultores.ventaboletos.service.TarifaMinimaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
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 long serialVersionUID = 1L;

	@Autowired
    private TarifaMinimaService tarifaMinimaService;
    @Autowired
    private MarcaService marcaService;
    @Autowired
    private ParadaService paradaService;
    @Autowired
    private ClaseServicioService claseServicioService;
    @Autowired
    private PlazaService plazaService;
    @Autowired
    private MonedaService monedaService;
    @Autowired
	private OrgaoConcedenteService orgaoConcedenteService;
    @Autowired
	private CategoriaService categoriaService;
    
    private List<Moneda> lsMoneda;
    private List<Marca> lsMarcas;
    private List<ClaseServicio> lsClaseServico;
    private List<Plaza> lsPlaza;
    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 = Logger.getLogger(EditarTarifaMinimaController.class);

    private List<Categoria> lsCategorias;
    private MyComboboxEstandar cmbCategorias;
    private MyListbox tarifaMinimaCategoriaList;

    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;
    }

    @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.obtenerTodasCategoriasVisibles();
        lsOrgaoConcedente = orgaoConcedenteService.obtenerTodos();
        lsMoneda = monedaService.obtenerTodos();
        lsMarcas = marcaService.buscarMarcaPorEmpresa(UsuarioLogado.getUsuarioLogado().getEmpresa());
        lsClaseServico = claseServicioService.obtenerTodos();
        lsPlaza = plazaService.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());
        }
    }

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

        txtImportancia.getValue();
        cmbMoneda.getValue();
        cmbPlaza.getValue();
        cmbMarca.getValue();
        cmbOrigem.getValue(true);
        cmbDestino.getValue(true);
        cmbClaseServicio.getValue();
        cmbOrgaoConcedente.getValue();

        tarifaMinima.setFecmodif(Calendar.getInstance().getTime());
        tarifaMinima.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
        tarifaMinima.setActivo(Boolean.TRUE);

        try {
        	if (tarifaMinima.getOrgaoConcedente() == null) {
                Messagebox.show(
                        Labels.getLabel("editarTarifaMinimaController.btnFechar.MSG.orgao"),
                        Labels.getLabel("editarTarifaMinimaController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
            }else if (tarifaMinima.getMoneda() == null) {
                Messagebox.show(
                        Labels.getLabel("editarTarifaMinimaController.btnFechar.MSG.moneda"),
                        Labels.getLabel("editarTarifaMinimaController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
            } else if (tarifaMinima.getPlaza() == null) {
                Messagebox.show(
                        Labels.getLabel("editarTarifaMinimaController.btnFechar.MSG.plaza"),
                        Labels.getLabel("editarTarifaMinimaController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
            } else if (tarifaMinima.getMarca() == null) {
                Messagebox.show(
                        Labels.getLabel("editarTarifaMinimaController.btnFechar.MSG.marca"),
                        Labels.getLabel("editarTarifaMinimaController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
            } else if (tarifaMinima.getOrigem() == null) {
                Messagebox.show(
                        Labels.getLabel("editarTarifaMinimaController.btnFechar.MSG.origen"),
                        Labels.getLabel("editarTarifaMinimaController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
            } else if (tarifaMinima.getDestino() == null) {
                Messagebox.show(
                        Labels.getLabel("editarTarifaMinimaController.btnFechar.MSG.destino"),
                        Labels.getLabel("editarTarifaMinimaController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
            } else if (tarifaMinima.getClaseServicio() == null) {
                Messagebox.show(
                        Labels.getLabel("editarTarifaMinimaController.btnFechar.MSG.tipo"),
                        Labels.getLabel("editarTarifaMinimaController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
            } else if (tarifaMinima.getOrigem().getParadaId().equals(tarifaMinima.getDestino().getParadaId())
                    && (!tarifaMinima.getOrigem().getParadaId().equals(-1) && !tarifaMinima.getDestino().getParadaId().equals(-1))) {
                Messagebox.show(
                        Labels.getLabel("MSG.Origem.Igual.Destino"),
                        Labels.getLabel("editarTarifaMinimaController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);

            } else {
                if (tarifaMinima.getTarifaminimaId() == null) {
                    List<TarifaMinima> lsTM = tarifaMinimaService.pesquisar(
                            tarifaMinima.getMoneda(), tarifaMinima.getPlaza(), tarifaMinima.getMarca(),
                            tarifaMinima.getOrigem(), tarifaMinima.getDestino(), tarifaMinima.getClaseServicio(),tarifaMinima.getOrgaoConcedente() );

                    if (lsTM.isEmpty()) {
                        tarifaMinimaService.suscribir(tarifaMinima);
                        tarifaMinimaList.addItem(tarifaMinima);

                        Messagebox.show(
                                Labels.getLabel("editarTarifaMinimaController.btnFechar.MSG.SuscbrirOK"),
                                Labels.getLabel("editarTarifaMinimaController.window.title"),
                                Messagebox.OK, Messagebox.INFORMATION);

                        closeWindow();
                    } else {
                        Messagebox.show(
                                Labels.getLabel("MSG.Registro.Existe"),
                                Labels.getLabel("editarTarifaMinimaController.window.title"),
                                Messagebox.OK, Messagebox.EXCLAMATION);
                    }
                } else {
                    tarifaMinimaService.actualizacion(tarifaMinima);
                    tarifaMinimaList.updateItem(tarifaMinima);

                    Messagebox.show(
                            Labels.getLabel("editarTarifaMinimaController.btnFechar.MSG.SuscbrirOK"),
                            Labels.getLabel("editarTarifaMinimaController.window.title"),
                            Messagebox.OK, Messagebox.INFORMATION);

                    closeWindow();
                }
            }

        } catch (Exception ex) {
            log.error("Editar tarida minimas: " + ex);
            Messagebox.show(
                    Labels.getLabel("MSG.Error"),
                    Labels.getLabel("editarTarifaMinimaController.window.title"),
                    Messagebox.OK, Messagebox.ERROR);
        }

    }

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

        try {
            int opcao = Messagebox.show(
                    Labels.getLabel("editarTarifaMinimaController.btnFechar.MSG.Deseja.Borrar"),
                    Labels.getLabel("editarTarifaMinimaController.window.title"),
                    Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

            if (opcao == Messagebox.YES) {
                tarifaMinimaService.borrar(tarifaMinima);
                tarifaMinimaList.removeItem(tarifaMinima);

                Messagebox.show(
                        Labels.getLabel("editarTarifaMinimaController.btnFechar.MSG.borrarOK"),
                        Labels.getLabel("editarTarifaMinimaController.window.title"),
                        Messagebox.OK, Messagebox.INFORMATION);

                closeWindow();
            }
        } catch (Exception ex) {
            log.error(ex);
        }
    }
    
    public void onClick$btnAdicionarCategoria(Event ev) throws InterruptedException {
    	try {
			
			Categoria categoria = (Categoria) cmbCategorias.getSelectedItem().getValue();
			
			if(categoria != null) {
				
				TarifaMinimaCategoria tarifaMinimaCategoria = new TarifaMinimaCategoria();
				tarifaMinimaCategoria.setCategoria(categoria);
				tarifaMinimaCategoria.setTarifaMinima(tarifaMinima);
				
				tarifaMinimaCategoria = tarifaMinimaService.adicionarTarifaMinimaCategoria(tarifaMinimaCategoria);

				tarifaMinimaCategoriaList.updateItem(tarifaMinimaCategoria);
			
	            Messagebox.show(Labels.getLabel("editarTarifaMinimaController.msg.adicionarTarifaMinimaCategoria"),
	    				Labels.getLabel("editarTarifaMinimaController.window.title"),
	    				Messagebox.OK,Messagebox.INFORMATION);
            
			}

		} catch (Exception e) {
			log.error(e.getMessage(), e);
		    Messagebox.show(Labels.getLabel("MSG.Error"),
		    				Labels.getLabel("editarTarifaMinimaController.window.title"),
		    				Messagebox.OK,Messagebox.ERROR);
		}    	
    }

    public void onClick$btnRemoverCategoria(Event ev) throws InterruptedException {
    	try {
			if(tarifaMinimaCategoriaList.getSelected() != null) {
				int resp = Messagebox.show(
						Labels.getLabel("editarTarifaMinimaController.msg.removerTarifaMinimaCategoriaPergunta"),
						Labels.getLabel("editarTarifaMinimaController.window.title"),
						Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);
	
				if (resp == Messagebox.YES) {
					TarifaMinimaCategoria tarifaMinimaCategoria = (TarifaMinimaCategoria) tarifaMinimaCategoriaList.getSelected();
					tarifaMinimaService.removerTarifaMinimaCategoria(tarifaMinimaCategoria);
					tarifaMinimaCategoriaList.removeItem(tarifaMinimaCategoria);
					
		            Messagebox.show(Labels.getLabel("editarTarifaMinimaController.msg.removerTarifaMinimaCategoria"),
		    				Labels.getLabel("editarTarifaMinimaController.window.title"),
		    				Messagebox.OK,Messagebox.INFORMATION);				
				}
			}
			
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		    Messagebox.show(Labels.getLabel("MSG.Error"),
		    				Labels.getLabel("editarTarifaMinimaController.window.title"),
		    				Messagebox.OK,Messagebox.ERROR);
		}
    }

	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;
	}
	
}
