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

import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.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.zk.ui.event.EventListener;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Row;
import org.zkoss.zul.Tab;
import org.zkoss.zul.api.Comboitem;

import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.CategoriaFormAutorizacao;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.GrupoCategoria;
import com.rjconsultores.ventaboletos.enums.TipoDescontoBPe;
import com.rjconsultores.ventaboletos.enums.TipoDescontoMonitrip;
import com.rjconsultores.ventaboletos.service.CategoriaFormAutorizacaoService;
import com.rjconsultores.ventaboletos.service.CategoriaService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.GrupoCategoriaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderCategoriaFormAutorizacao;

/**
 *
 * @author Rafius
 */
@Controller("editarCategoriaController")
@Scope("prototype")
public class EditarCategoriaController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	@Autowired
    private CategoriaService categoriaService;
    @Autowired
    private GrupoCategoriaService grupoCategoriaService;
    @Autowired
	private EmpresaService empresaService;
    @Autowired
    private CategoriaFormAutorizacaoService categoriaFormAutorizacaoService;
	
    private Categoria categoria;
    private MyListbox categoriaList;
    private Button btnApagar;
    private Button btnSalvar;
    private static Logger log = LogManager.getLogger(EditarCategoriaController.class);
    private MyTextbox txtNome;
    private MyTextbox txtCvecategoria;
    private MyTextbox txtDescImpresionGratuidade;
    private Combobox cmbGrupoCategoria;
    private Combobox cmbDescontoMonitrip;
    private Combobox cmbDescontoBPe;
    
	private Checkbox chkIndemitetermorecusa;
	private Checkbox chkIndnaousaassento;
	private Checkbox chkIndvendenaapi;
	private Checkbox chkIndExigeIdentidade;
	private Checkbox chkEmiteFormularioAutorizacao;
	
	private Checkbox chkIndntegracaoAGR;
	
	private MyListbox tipoPassagemAutorizacaoList;
	
    private List<GrupoCategoria> lsGrupoCategoria;
    
    private List<TipoDescontoMonitrip> lsTipoDescontoMonitrips;
    private List<TipoDescontoBPe> lsTipoDescontoBPe;

	private List<Empresa> lsEmpresa;
	
	private List<CategoriaFormAutorizacao> lsTipoPassagemAutorizacao;
    
    private static String CVESISTEMA_FIDELIDADE = "FIDELIDADE";
    
    private Tab tabAutorizacao;
    
    private Row rowVendaEmPeAPI;
	private Radio radioVendaEmPeAPISim;
	private Radio radioVendaEmPeAPINao;
    
    @Override
    public void doAfterCompose(Component comp) throws Exception {    	
        super.doAfterCompose(comp);
        lsGrupoCategoria = grupoCategoriaService.obtenerTodos();
        lsTipoDescontoMonitrips = Arrays.asList(TipoDescontoMonitrip.values());
        lsTipoDescontoBPe = Arrays.asList(TipoDescontoBPe.values());
        
        GrupoCategoria branco = new GrupoCategoria();
        branco.setDescGrupo("\t\t");
        branco.setActivo(true);
        lsGrupoCategoria.add(0, branco);
        categoria = (Categoria) Executions.getCurrent().getArg().get("categoria");
        categoriaList = (MyListbox) Executions.getCurrent(	).getArg().get("categoriaList");


        lsTipoPassagemAutorizacao = categoriaFormAutorizacaoService.obtenerTodosPorCategoria(categoria.getCategoriaId());
        
        if (categoria.getCategoriaId() == null) {
            btnApagar.setVisible(Boolean.FALSE);
        } else if(CVESISTEMA_FIDELIDADE.equals(categoria.getCvesistema())){ 
        	btnSalvar.setVisible(Boolean.FALSE);
        	btnApagar.setVisible(Boolean.FALSE);
        	
        	Messagebox.show(
                    Labels.getLabel("MSG.noEditabled"),
                    Labels.getLabel("editarCategoriaController.window.title"),
                    Messagebox.OK, Messagebox.INFORMATION);
        	
        } else {
            if (categoria.getCategoriaId() == 1 || categoria.getCategoriaId() == 6) {
                btnApagar.setVisible(Boolean.FALSE);
                txtNome.setDisabled(Boolean.TRUE);

                Messagebox.show(
                        Labels.getLabel("MSG.noEditabled"),
                        Labels.getLabel("editarCategoriaController.window.title"),
                        Messagebox.OK, Messagebox.INFORMATION);
            }
        }
         
        chkIndemitetermorecusa.setChecked((categoria.getIndemitetermorecusa() == null) ? false : categoria.getIndemitetermorecusa());
        chkIndnaousaassento.setChecked((categoria.getIndnaousaassento() == null) ? false : categoria.getIndnaousaassento());
        chkIndvendenaapi.setChecked((categoria.getIndvendeapi() == null) ? false : categoria.getIndvendeapi());
        chkIndExigeIdentidade.setChecked((categoria.getIndExigeIdentidade() == null) ? false : categoria.getIndExigeIdentidade());
        
        chkIndntegracaoAGR.setChecked(categoria.getIndIntegracaoAGR());
        chkEmiteFormularioAutorizacao.setChecked(categoria.getIndEmiteFormularioAutorizacao());
        rowVendaEmPeAPI.setVisible(chkIndvendenaapi.isChecked()); 
        chkIndvendenaapi.addEventListener("onCheck", new EventListener() {
            @Override
            public void onEvent(Event event) throws Exception {
            	rowVendaEmPeAPI.setVisible(chkIndvendenaapi.isChecked());                       
            }                       
        });
        
		if (categoria.getGrupoCategoria() != null) {
			cmbGrupoCategoria.setValue(categoria.getGrupoCategoria().getDescGrupo());
		}
        txtNome.focus();
        
        lsTipoPassagemAutorizacao = categoriaFormAutorizacaoService.obtenerTodosPorCategoria(categoria.getCategoriaId());
        tipoPassagemAutorizacaoList.setItemRenderer(new RenderCategoriaFormAutorizacao());
        tipoPassagemAutorizacaoList.addEventListener("onDoubleClick", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				CategoriaFormAutorizacao form = (CategoriaFormAutorizacao) tipoPassagemAutorizacaoList.getSelected();
		    	verFormAutorizacao(form);
			}
		});
        tipoPassagemAutorizacaoList.setData(lsTipoPassagemAutorizacao);
        chkEmiteFormularioAutorizacao.addEventListener("onClick", new EventListener() {
            @Override
            public void onEvent(Event event) throws Exception {
                tabAutorizacao.setVisible(chkEmiteFormularioAutorizacao.isChecked());                       
            }                       
        });
		if(Boolean.TRUE.equals(categoria.getIndVendaEmPeAPI())) {
			radioVendaEmPeAPISim.setChecked(Boolean.TRUE);
		}else {
			radioVendaEmPeAPINao.setChecked(Boolean.TRUE);
		}

    }
    
    private void verFormAutorizacao(CategoriaFormAutorizacao form) {
    	Map args = new HashMap();
		args.put("form", form);
		args.put("formList", tipoPassagemAutorizacaoList);
		args.put("categoria", categoria);

		openWindow("/gui/catalogos/editarFormAutorizacao.zul",
				Labels.getLabel("editarCategoriaController.window.title"), args, MODAL);
    }
    
    public void onClick$btnAdicionarForm(Event ev) throws InterruptedException {
    	verFormAutorizacao(new CategoriaFormAutorizacao());
	}
    
    public void onClick$btnRemoverForm(Event ev) throws InterruptedException {
    	int resp = Messagebox.show(
                Labels.getLabel("editarFormAutorizacaoController.MSG.borrarPergunta"),
                Labels.getLabel("editarFormAutorizacaoController.window.title"),
                Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

        if (resp == Messagebox.YES) {
        	CategoriaFormAutorizacao form = (CategoriaFormAutorizacao)tipoPassagemAutorizacaoList.getSelected();
        	
        	categoriaFormAutorizacaoService.borrar(form);
        	
        	Messagebox.show(
                    Labels.getLabel("editarFormAutorizacaoController.MSG.borrarOK"),
                    Labels.getLabel("editarFormAutorizacaoController.window.title"),
                    Messagebox.OK, Messagebox.INFORMATION);

            tipoPassagemAutorizacaoList.removeItem(form);

        }
	}

    public void onClick$btnSalvar(Event ev) throws InterruptedException {
        txtNome.getValue();
        txtCvecategoria.getValue();
        try {
            categoria.setActivo(true);
            categoria.setFecmodif(Calendar.getInstance().getTime());
            categoria.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
            categoria.setIndemitetermorecusa(chkIndemitetermorecusa.isChecked());
            categoria.setIndnaousaassento(chkIndnaousaassento.isChecked());
            categoria.setIndvendeapi(chkIndvendenaapi.isChecked());
            categoria.setIndExigeIdentidade(chkIndExigeIdentidade.isChecked());
            categoria.setIndIntegracaoAGR(chkIndntegracaoAGR.isChecked());
            categoria.setIndEmiteFormularioAutorizacao(chkEmiteFormularioAutorizacao.isChecked());
            if(chkIndvendenaapi.isChecked()) {
            	categoria.setIndVendaEmPeAPI(radioVendaEmPeAPISim.isSelected() ? Boolean.TRUE : Boolean.FALSE );
            }else {
            	categoria.setIndVendaEmPeAPI(Boolean.FALSE);

            }
            
            Comboitem grupo = cmbGrupoCategoria.getSelectedItem();
            
            if (grupo != null){
            	
            	GrupoCategoria gruCat = (GrupoCategoria)grupo.getValue();
            	if(!gruCat.getDescGrupo().trim().isEmpty()){
            		categoria.setGrupoCategoria(gruCat);
            	}else{
            		categoria.setGrupoCategoria(null);
            	}
            	
            }else{
            	categoria.setGrupoCategoria(null);
            }
            
            Comboitem cbDescontoMonitrip = cmbDescontoMonitrip.getSelectedItem();
            categoria.setTipoDescontoMonitrip(null);
            if(cbDescontoMonitrip != null) {
            	categoria.setTipoDescontoMonitrip((TipoDescontoMonitrip) cbDescontoMonitrip.getValue());
            }

            Comboitem cbDescontoBPe = cmbDescontoBPe.getSelectedItem();
            categoria.setTipoDescontoBPe(null);
            if(cbDescontoBPe != null){
            	categoria.setTipoDescontoBPe((TipoDescontoBPe) cbDescontoBPe.getValue());
            }

            if (categoria.getCategoriaId() == null) {
                List<Categoria> lsCategoria =
                        categoriaService.buscar(categoria.getDesccategoria().trim());

                if (lsCategoria.isEmpty()) {
                    categoriaService.suscribir(categoria);
                    categoriaList.addItem(categoria);

                    Messagebox.show(
                            Labels.getLabel("editarCategoriaController.MSG.suscribirOK"),
                            Labels.getLabel("editarCategoriaController.window.title"),
                            Messagebox.OK, Messagebox.INFORMATION);
                } else {
                    Messagebox.show(
                            Labels.getLabel("MSG.Registro.Existe"),
                            Labels.getLabel("editarCategoriaController.window.title"),
                            Messagebox.OK, Messagebox.EXCLAMATION);
                }
            } else {
                categoriaService.actualizacion(categoria);
                categoriaList.updateItem(categoria);

                Messagebox.show(
                        Labels.getLabel("editarCategoriaController.MSG.suscribirOK"),
                        Labels.getLabel("editarCategoriaController.window.title"),
                        Messagebox.OK, Messagebox.INFORMATION);
            }

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

    public void onClick$btnApagar(Event ev) throws InterruptedException {
        
        int resp = Messagebox.show(
                Labels.getLabel("editarCategoriaController.MSG.borrarPergunta"),
                Labels.getLabel("editarCategoriaController.window.title"),
                Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

        if (resp == Messagebox.YES) {

            categoriaService.borrar(categoria);

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

            categoriaList.removeItem(categoria);

            closeWindow();
        }
        
    }

    public Categoria getCategoria() {
        return categoria;
    }

    public void setCategoria(Categoria categoria) {
        this.categoria = categoria;
    }

    public MyListbox getCategoriaList() {
        return categoriaList;
    }

    public void setCategoriaList(MyListbox categoriaList) {
        this.categoriaList = categoriaList;
    }

    public CategoriaService getCategoriaService() {
        return categoriaService;
    }

    public void setCategoriaService(CategoriaService categoriaService) {
        this.categoriaService = categoriaService;
    }

	public List<GrupoCategoria> getLsGrupoCategoria() {
		return lsGrupoCategoria;
	}

	public void setLsGrupoCategoria(List<GrupoCategoria> lsGrupoCategoria) {
		this.lsGrupoCategoria = lsGrupoCategoria;
	}

	public GrupoCategoriaService getGrupoCategoriaService() {
		return grupoCategoriaService;
	}

	public void setGrupoCategoriaService(GrupoCategoriaService grupoCategoriaService) {
		this.grupoCategoriaService = grupoCategoriaService;
	}

	public List<TipoDescontoMonitrip> getLsTipoDescontoMonitrips() {
		return lsTipoDescontoMonitrips;
	}

	public void setLsTipoDescontoMonitrips(List<TipoDescontoMonitrip> lsTipoDescontoMonitrips) {
		this.lsTipoDescontoMonitrips = lsTipoDescontoMonitrips;
	}

	public List<TipoDescontoBPe> getLsTipoDescontoBPe() {
		return lsTipoDescontoBPe;
	}

	public void setLsTipoDescontoBPe(List<TipoDescontoBPe> lsTipoDescontoBPe) {
		this.lsTipoDescontoBPe = lsTipoDescontoBPe;
	}

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

	public void setLsEmpresa(List<Empresa> lsEmpresa) {
		this.lsEmpresa = lsEmpresa;
	}

	public MyListbox getTipoPassagemAutorizacaoList() {
		return tipoPassagemAutorizacaoList;
	}

	public void setTipoPassagemAutorizacaoList(MyListbox tipoPassagemAutorizacaoList) {
		this.tipoPassagemAutorizacaoList = tipoPassagemAutorizacaoList;
	}
		
}
