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

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

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.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Image;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Row;
import org.zkoss.zul.Tab;
import org.zkoss.zul.api.Radio;

import com.rjconsultores.ventaboletos.constantes.ConstantesFuncionSistema;
import com.rjconsultores.ventaboletos.entidad.ContaMD;
import com.rjconsultores.ventaboletos.entidad.DescontoComissao;
import com.rjconsultores.ventaboletos.entidad.ItemDesconto;
import com.rjconsultores.ventaboletos.entidad.PtovtaComissao;
import com.rjconsultores.ventaboletos.entidad.PtovtaContaMD;
import com.rjconsultores.ventaboletos.enums.ModeloComissaoImpressaoPosterior;
import com.rjconsultores.ventaboletos.service.ContaMDService;
import com.rjconsultores.ventaboletos.service.DescontoComissaoService;
import com.rjconsultores.ventaboletos.service.ItemDescontoService;
import com.rjconsultores.ventaboletos.service.PtovtaComissaoService;
import com.rjconsultores.ventaboletos.service.PtovtaContaMDService;
import com.rjconsultores.ventaboletos.service.PuntoVentaService;
import com.rjconsultores.ventaboletos.utilerias.MoneyHelper;
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;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderPtovtaContaMB;

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

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

	@Autowired
	private PtovtaComissaoService ptovtaComissaoService;

	@Autowired
	private PuntoVentaService puntoVentaService;
	
	@Autowired
	private PtovtaContaMDService ptovtaContaMDService;
	
	@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;
	
	/* Porcentagem comissão */
	private Tab tabPorcentagemComissao;
	private BigDecimal porcentagemConta;
	private List<ContaMD> lsConta;
	private MyComboboxEstandar cmbConta;
	private MyTextboxDecimal txtPorcentagem;
	
	@Autowired
    private transient PagedListWrapper<PtovtaContaMD> plwPorcentagemConta;
	private MyListbox porcentagemContaList;
	private Paging pagingPorcentagemConta;
	
	@Autowired
	private ContaMDService contaMDService;
	
	@Autowired
    private transient PagedListWrapper<DescontoComissao> plwDescontoComissao;
    private MyListbox descontoComissaoList;
    private Paging pagingDescontoComissao;
    
    private Radio rdComissaoImpPosteriorPadrao;
    private Radio rdComissaoImpPosteriorCompartilhado;
    
    private Row rowComissaoImpPadrao;
    private Row rowComissaoImpPadraoValores;
    
    private Row rowComissaoImpVendaCompartilhada;
    private Row rowComissaoImpImpressaoCompartilhada;
    
    private Image imgModeloImpPosterior;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		
		super.doAfterCompose(comp);
		
		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();
		this.imgModeloImpPosterior.setTooltiptext(Labels.getLabel("editarConfiguracionComissaoController.lbModeloImpPosteriorAjuda.value", new Object[] {"\n"}));
		
		this.lsConta = this.contaMDService.obtenerTodos();
		this.porcentagemConta = new BigDecimal(0);
		
		if (isPermissaoEditarPorcentagem()) {
			tabPorcentagemComissao.setVisible(true);
		}
		
		
		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());
		}
		
		ativarDesativarCamposComissaoImpPosterior();
		
		descontoComissaoList.setItemRenderer(new RenderDescontoComissao());
        descontoComissaoList.addEventListener("onDoubleClick", new EventListener() {

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

        refreshLista();
        refreshListaConta();
	}

	public void onClick$btnSalvarPtovtaComissao(Event ev) throws InterruptedException {
		
		if(!verificarCampos()) {
			return;
		}

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

		Messagebox.show(
				Labels.getLabel("editarPuntoVentaComissaoController.MSG.suscribirOK"),
				Labels.getLabel("editarPuntoVentaComissaoController.window.title", new String[] {this.ptovtaComissao.getEmpresaId().getNombempresa()}),
				Messagebox.OK, Messagebox.INFORMATION);

		closeWindow();

	}

	private void definirValoresComissaoSeguroObrigatorio() {
		if(isCheckboxSeguroMarcado()) {
			ptovtaComissao.setSeguroobrigatorioBaixa(null);
			ptovtaComissao.setSeguroobrigatorioAlta(null);
		}
	}

	public void onClick$btnApagarPtovtaComissao(Event ev) {
		try {
			int resp = Messagebox.show(
					Labels.getLabel("editarPuntoVentaComissaoController.MSG.borrarPergunta"),
					Labels.getLabel("editarPuntoVentaComissaoController.window.title", new String[] {this.ptovtaComissao.getEmpresaId().getNombempresa()}),
					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", new String[] {this.ptovtaComissao.getEmpresaId().getNombempresa()}),
						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 void onClick$btnAdicionarContaPorcentagem() {
		
		try {
			if(this.cmbConta.getSelectedItem() != null && this.porcentagemConta != null && !this.porcentagemConta.equals(BigDecimal.ZERO)){
				
				PtovtaContaMD ptovtaContaMD = new PtovtaContaMD();
				
				ptovtaContaMD.setContaId(this.cmbConta.getSelecteObject(ContaMD.class));
				ptovtaContaMD.setPercentual(this.porcentagemConta);
				ptovtaContaMD.setPuntoventaId(this.ptovtaComissao.getPuntoventaId());
				ptovtaContaMD.setEmpresaId(this.ptovtaComissao.getEmpresaId());
				ptovtaContaMD.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				ptovtaContaMD.setFecmodif(new Date());
				ptovtaContaMD.setActivo(Boolean.TRUE);
				
				
				if(ptovtaContaMDService.contemItem(ptovtaContaMD)){
					
					Messagebox.show(
							Labels.getLabel("editarPuntoVentaComissaoController.MSG.jaPossuiItem"),
							Labels.getLabel("editarPuntoVentaComissaoController.window.title", new String[]{ptovtaComissao.getEmpresaId().getNombempresa()}),
							Messagebox.OK, Messagebox.ERROR);
					
					return;
				}
				
				
				ptovtaContaMDService.suscribir(ptovtaContaMD);
				
				Messagebox.show(
						Labels.getLabel("editarPuntoVentaComissaoController.MSG.suscribirOKContaMD"),
						Labels.getLabel("editarPuntoVentaComissaoController.window.title", new String[]{ptovtaComissao.getEmpresaId().getNombempresa()}),
						Messagebox.OK, Messagebox.INFORMATION);
				
				refreshListaConta();
			}
		} catch (Exception ex) {
			log.error(ex.toString());
		}
	}
	
	public void onClick$btnRemoverContaPorcentagem() {
		
		try {
			if (porcentagemContaList.getSelected() != null) {
				int resp = Messagebox.show(
						Labels.getLabel("editarPuntoVentaComissaoController.MSG.borrarPerguntaPtovtaContaMD"),
						Labels.getLabel("editarPuntoVentaComissaoController.window.title", new String[]{ptovtaComissao.getEmpresaId().getNombempresa()}),
						Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

				if (resp == Messagebox.YES) {
					PtovtaContaMD ptovtaContaMD = (PtovtaContaMD) porcentagemContaList.getSelected();
					ptovtaContaMDService.borrar(ptovtaContaMD);
					porcentagemContaList.removeItem(ptovtaContaMD);
					
					log.warn("Usuario " + UsuarioLogado.getUsuarioLogado().getNombusuario() + " excluiu o PtovtaContaMD " + ptovtaContaMD.getPtovtaContaId());

					Messagebox.show(
							Labels.getLabel("editarPuntoVentaComissaoController.MSG.borrarOKContaMD"),
							Labels.getLabel("editarPuntoVentaComissaoController.window.title", new String[]{ptovtaComissao.getEmpresaId().getNombempresa()}),
							Messagebox.OK, Messagebox.INFORMATION);
					
					refreshListaConta();
				}
			}
		} catch (Exception ex) {
			log.error(ex.toString());
		}
		
	}
	
	private void refreshListaConta() {
    	try {
			HibernateSearchObject<PtovtaContaMD> ptovtaContaMDBusqueda = new HibernateSearchObject<PtovtaContaMD>(PtovtaContaMD.class, pagingPorcentagemConta.getPageSize());
			
			ptovtaContaMDBusqueda.addFilterEqual("activo", Boolean.TRUE);
			ptovtaContaMDBusqueda.addFilterEqual("puntoventaId", ptovtaComissao.getPuntoventaId());
			ptovtaContaMDBusqueda.addFilterEqual("empresaId", ptovtaComissao.getEmpresaId());
			plwPorcentagemConta.init(ptovtaContaMDBusqueda, porcentagemContaList, pagingPorcentagemConta);
	
    	} catch (Exception e) {
    		log.error(e.getMessage(), e.getCause());
    	}
    }
	
	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(ConstantesFuncionSistema.CLAVE_EDITAR_COMISSAO);
	}
	
	public Boolean isPermissaoEditarPorcentagem() {
		return UsuarioLogado.getUsuarioLogado().isPermisoClave(ConstantesFuncionSistema.CLAVE_EXIBIR_TAB_COMISSAO_CONTA);
	}

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

	public DescontoComissao getDescontoComissao() {
		return descontoComissao;
	}

	public void setDescontoComissao(DescontoComissao descontoComissao) {
		this.descontoComissao = descontoComissao;
	}
	
	public MyComboboxEstandar getCmbConta() {
		return cmbConta;
	}
	
	public void setCmbConta(MyComboboxEstandar cmbConta) {
		this.cmbConta = cmbConta;
	}
	
	public List<ContaMD> getLsConta() {
		return lsConta;
	}
	
	public void setLsConta(List<ContaMD> lsConta) {
		this.lsConta = lsConta;
	}

	public BigDecimal getPorcentagemConta() {
		return porcentagemConta;
	}

	public void setPorcentagemConta(BigDecimal porcentagemConta) {
		this.porcentagemConta = porcentagemConta;
	}
	
	private void ativarDesativarCamposComissaoImpPosterior() {
		rowComissaoImpVendaCompartilhada.setVisible(false);
		rowComissaoImpImpressaoCompartilhada.setVisible(false);
		rowComissaoImpPadrao.setVisible(false);
		rowComissaoImpPadraoValores.setVisible(false);
		if(ModeloComissaoImpressaoPosterior.PADRAO.equals(ptovtaComissao.getModeloComissaoImpressaoPosterior())) {
			rdComissaoImpPosteriorPadrao.setChecked(true);
			rdComissaoImpPosteriorCompartilhado.setChecked(false);
			rowComissaoImpPadrao.setVisible(true);
			rowComissaoImpPadraoValores.setVisible(true);
		} else {
			rdComissaoImpPosteriorPadrao.setChecked(false);
			rdComissaoImpPosteriorCompartilhado.setChecked(true);
			rowComissaoImpVendaCompartilhada.setVisible(true);
			rowComissaoImpImpressaoCompartilhada.setVisible(true);
		}
	}
	
	private void definirValoresCamposComissaoImpPosterior() {
		if(ModeloComissaoImpressaoPosterior.COMPARTILHADA.equals(ptovtaComissao.getModeloComissaoImpressaoPosterior())) {
			this.ptovtaComissao.setValorImpressaoGap(null);
			this.ptovtaComissao.setValorImpressaoGapAlta(null);
			this.ptovtaComissao.setIndimpressaogapporc(false);
		} else {
			this.ptovtaComissao.setValorImpGapComp(null);
			this.ptovtaComissao.setValorImpGapCompAlta(null);
			this.ptovtaComissao.setValorVendaGapComp(null);
			this.ptovtaComissao.setValorVendaGapCompAlta(null);
		}
	}
	
	public void onClick$rdComissaoImpPosteriorPadrao() {
		this.ptovtaComissao.setModeloComissaoImpressaoPosterior(ModeloComissaoImpressaoPosterior.PADRAO);
		ativarDesativarCamposComissaoImpPosterior();
	}
	
	public void onClick$rdComissaoImpPosteriorCompartilhado() {
		this.ptovtaComissao.setModeloComissaoImpressaoPosterior(ModeloComissaoImpressaoPosterior.COMPARTILHADA);
		ativarDesativarCamposComissaoImpPosterior();
	}
	
	private boolean verificarCampos() throws InterruptedException {
		if(isCheckboxSeguroMarcado() && isCampoPercentualSeguroPreenchido()) {
			Messagebox.show(
					Labels.getLabel("editarPuntoVentaComissaoController.MSG.valorCamposSeguro"),
					Labels.getLabel("editarPuntoVentaComissaoController.window.title", new String[] {this.ptovtaComissao.getEmpresaId().getNombempresa()}),
					Messagebox.OK, Messagebox.EXCLAMATION);			
			
			return false;
		}
		return true;
	}

	private boolean isCheckboxSeguroMarcado() {
		return ptovtaComissao.getSeguroReceita() || ptovtaComissao.getSeguroDev();
	}

	private boolean isCampoPercentualSeguroPreenchido() {
		return !isNullOrZero(ptovtaComissao.getSeguroobrigatorioBaixa()) || !isNullOrZero(ptovtaComissao.getSeguroobrigatorioAlta());
	}

	private boolean isNullOrZero(BigDecimal valor) {
		return valor == null || MoneyHelper.isIgual(valor, BigDecimal.ZERO);
	}

}
