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

import java.text.DecimalFormat;
import java.util.List;
import java.util.Locale;

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.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.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Paging;

import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.entidad.DescontoComissao;
import com.rjconsultores.ventaboletos.entidad.ItemDesconto;
import com.rjconsultores.ventaboletos.entidad.PtovtaComissao;
import com.rjconsultores.ventaboletos.service.DescontoComissaoService;
import com.rjconsultores.ventaboletos.service.ItemDescontoService;
import com.rjconsultores.ventaboletos.service.PtovtaComissaoService;
import com.rjconsultores.ventaboletos.service.PuntoVentaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
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.MyTextboxDecimal;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderDescontoComissao;

/**
 * 
 * @author Bruno H. G. Gouvêa <bruno@rjconsultores.com.br>
 * 
 */
@Controller("editarPuntoVentaComissaoController")
@Scope("prototype")
public class EditarPuntoVentaComissaoController extends MyGenericForwardComposer {
	
	private static final long serialVersionUID = 1L;

	private static Logger log = Logger.getLogger(EditarPuntoVentaComissaoController.class);
	
	private static final Locale LOC = new Locale("pt","br");

	@Autowired
	private PtovtaComissaoService ptovtaComissaoService;

	@Autowired
	private PuntoVentaService puntoVentaService;
	
	@Autowired
	private ItemDescontoService itemDescontoService;

	private MyListbox ptovtaComissaoList;

	private MyComboboxEstandar cmbReceita;

	private PtovtaComissao ptovtaComissao;
	
	
	@Autowired
	private DescontoComissaoService descontoComissaoService;

	/* Itens de desconto */
	private List<ItemDesconto> lsItemDesconto;
	private MyComboboxEstandar cmbItemDesconto;
	private Datebox datainicial;
	private Datebox dataFinal;
	private MyTextbox txtObservacao;
	private MyTextboxDecimal txtItemDescontoPreco;
	private DescontoComissao descontoComissao;
	
	@Autowired
    private transient PagedListWrapper<DescontoComissao> plwDescontoComissao;
    private MyListbox descontoComissaoList;
    private Paging pagingDescontoComissao;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		PtovtaComissao ptovtaComissao = (PtovtaComissao) Executions.getCurrent().getArg().get("ptovtaComissao");
		this.ptovtaComissaoList = (MyListbox) Executions.getCurrent().getArg().get("ptovtaComissaoList");
		this.ptovtaComissao = ptovtaComissaoService.obtenerID(ptovtaComissao.getPtovtaComissaoId());
		this.lsItemDesconto = itemDescontoService.obtenerTodos();
		this.descontoComissao = new DescontoComissao();

		super.doAfterCompose(comp);
		
		for (PtovtaComissao.Receita p : PtovtaComissao.Receita.values()) {
			Comboitem comboItem = new Comboitem(p.descricao());
			comboItem.setValue(p.valor());
			comboItem.setParent(cmbReceita);

		}

		if (this.ptovtaComissao.getReceita() != null) {
			if (this.ptovtaComissao.getReceita().equals("RB")) {
				cmbReceita.setSelectedIndex(0);
			} else if (this.ptovtaComissao.getReceita().equals("RL")) {
				cmbReceita.setSelectedIndex(1);
			}
		}
		
		if(ptovtaComissao.getPuntoventaId().getPuntoVentaPadre() != null) {
			this.ptovtaComissao.setDescComissaoId(ptovtaComissao.getPuntoventaId().getPuntoVentaPadre());
		} else {
			this.ptovtaComissao.setDescComissaoId(ptovtaComissao.getPuntoventaId());
		}
		
		descontoComissaoList.setItemRenderer(new RenderDescontoComissao());
        descontoComissaoList.addEventListener("onDoubleClick", new EventListener() {

            @Override
            public void onEvent(Event event) throws Exception {
                DescontoComissao a = (DescontoComissao) descontoComissaoList.getSelected();
                verDescontoComissao(a);
            }
            
        });

        refreshLista();
	}

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

		if (cmbReceita.getSelectedItem() != null) {
			this.ptovtaComissao.setReceita((String) cmbReceita.getSelectedItem().getValue());
		}
		ptovtaComissaoService.actualizacion(this.ptovtaComissao);

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

		closeWindow();

	}

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

			if (resp == Messagebox.YES) {

				ptovtaComissaoService.borrar(this.ptovtaComissao);

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

				ptovtaComissaoList.removeItem(this.ptovtaComissao);

				closeWindow();
			}
		} catch (Exception ex) {
			log.error(ex);
		}
	}
	
	private void verDescontoComissao(DescontoComissao a) {
		descontoComissao = a;
		cmbItemDesconto.setText(descontoComissao.getItemDesconto().toString());
		datainicial.setValue(descontoComissao.getDatainicial());
		dataFinal.setValue(descontoComissao.getDatafinal());
		txtObservacao.setValue(descontoComissao.getObservacao());
		txtItemDescontoPreco.setValue(DecimalFormat.getInstance(LOC).format(descontoComissao.getPreco()));
	}
	
	public void onClick$btnAddDescontoComissao() {
		try {
			
			cmbItemDesconto.getValue();
			datainicial.getValue();
			dataFinal.getValue();
			txtObservacao.getValue();
			txtItemDescontoPreco.getValue();
			
			if(descontoComissao == null) {
				descontoComissao = new DescontoComissao();
			}
			descontoComissao.setDatainicial(datainicial.getValue());
			descontoComissao.setDatafinal(dataFinal.getValue());
			descontoComissao.setItemDesconto((ItemDesconto) cmbItemDesconto.getSelectedItem().getValue());
			descontoComissao.setPreco(txtItemDescontoPreco.getValueDecimal());
			descontoComissao.setObservacao(txtObservacao.getValue());
			descontoComissao.setEmpresa(ptovtaComissao.getEmpresaId());
			descontoComissao.setPuntoVenta(ptovtaComissao.getPuntoventaId());
			
			descontoComissaoService.suscribirOrActualizacion(this.descontoComissao);
			descontoComissaoList.updateItem(descontoComissao);
			
			limparCamposDescontoComissao();
			
			Messagebox.show(
					Labels.getLabel("editarConfiguracionComissaoController.MSG.descontoComissaoOk"),
					Labels.getLabel("editarPuntoVentaComissaoController.window.title", new String[]{ptovtaComissao.getEmpresaId().getNombempresa()}),
					Messagebox.OK, Messagebox.INFORMATION);
			
			refreshLista();

		} catch (Exception ex) {
			log.error(ex.getMessage(), ex);
		}
	}
	
	private void limparCamposDescontoComissao() {
		descontoComissao = new DescontoComissao();
		cmbItemDesconto.setSelectedIndex(-1);
		dataFinal.setValue(null);
		datainicial.setValue(null);
		txtObservacao.setValue("");
		txtItemDescontoPreco.setValue("");
	}

	private void refreshLista() {
    	try {
			HibernateSearchObject<DescontoComissao> descontoComissaoBusqueda = new HibernateSearchObject<DescontoComissao>(DescontoComissao.class, pagingDescontoComissao.getPageSize());
			
			descontoComissaoBusqueda.addFilterEqual("activo", Boolean.TRUE);
			descontoComissaoBusqueda.addFilterEqual("puntoVenta", ptovtaComissao.getPuntoventaId());
			descontoComissaoBusqueda.addFilterEqual("empresa", ptovtaComissao.getEmpresaId());
			plwDescontoComissao.init(descontoComissaoBusqueda, descontoComissaoList, pagingDescontoComissao);
	
    	} catch (Exception e) {
    		log.error(e.getMessage(), e.getCause());
    	}
    }

	public void onClick$btnRemDescontoComissao() {
		try {
			int resp = Messagebox.show(
					Labels.getLabel("editarConfiguracionComissaoController.MSG.descontoComissaoBorrarPergunta"),
					Labels.getLabel("editarPuntoVentaComissaoController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (resp == Messagebox.YES) {

				DescontoComissao descontoComissao = (DescontoComissao) descontoComissaoList.getSelected();
				descontoComissaoService.borrar(descontoComissao);
				descontoComissaoList.removeItem(descontoComissao);
				
				Messagebox.show(
						Labels.getLabel("editarConfiguracionComissaoController.MSG.descontoComissaoBorrarOk"),
						Labels.getLabel("editarPuntoVentaComissaoController.window.title", new String[]{ptovtaComissao.getEmpresaId().getNombempresa()}),
						Messagebox.OK, Messagebox.INFORMATION);


			}
		} catch (Exception ex) {
			log.error(ex);
		}
	}
	
	public void onChange$cmbItemDesconto(Event ev) {
		if(cmbItemDesconto.getSelectedItem() != null) {
			if(descontoComissao == null) {
				descontoComissao = new DescontoComissao();
			}
			txtItemDescontoPreco.setValue(DecimalFormat.getInstance(LOC).format(((ItemDesconto)cmbItemDesconto.getSelectedItem().getValue()).getPreco()));
		}
	}
	
	public PuntoVentaService getPuntoVentaService() {
		return puntoVentaService;
	}

	public void setPuntoVentaService(PuntoVentaService puntoVentaService) {
		this.puntoVentaService = puntoVentaService;
	}

	public PtovtaComissao getPtovtaComissao() {
		return ptovtaComissao;
	}

	public void setPtovtaComissao(PtovtaComissao ptovtaComissao) {
		this.ptovtaComissao = ptovtaComissao;
	}

	/**
	 * @return the cmbReceita
	 */
	public MyComboboxEstandar getCmbReceita() {
		return cmbReceita;
	}

	/**
	 * @param cmbReceita
	 *            the cmbReceita to set
	 */
	public void setCmbReceita(MyComboboxEstandar cmbReceita) {
		this.cmbReceita = cmbReceita;
	}
	
	public Boolean isPermissaoEditarComissao() {
		return UsuarioLogado.getUsuarioLogado().isPermisoClave(Constantes.CLAVE_EDITAR_COMISSAO);
	}

	public List<ItemDesconto> getLsItemDesconto() {
		return lsItemDesconto;
	}

	public DescontoComissao getDescontoComissao() {
		return descontoComissao;
	}

	public void setDescontoComissao(DescontoComissao descontoComissao) {
		this.descontoComissao = descontoComissao;
	}

}
