/**
 * 
 */
package com.rjconsultores.ventaboletos.web.gui.controladores.seguridad.contingencia;

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.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Radiogroup;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.entidad.Constante;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.entidad.LogHistoricoContingencia;
import com.rjconsultores.ventaboletos.enums.EStatusContingencia;
import com.rjconsultores.ventaboletos.enums.TypeEventListener;
import com.rjconsultores.ventaboletos.rest.ContingenciaClienteRest;
import com.rjconsultores.ventaboletos.service.ConstanteService;
import com.rjconsultores.ventaboletos.service.EstadoService;
import com.rjconsultores.ventaboletos.utilerias.StringHelper;
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.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderHistoricoContingencia;
import com.trg.search.Filter;

/**
 * @author vjcor
 *
 */
@Controller("editarContigenciaController")
@Scope("prototype")
public class EditarContigenciaController extends MyGenericForwardComposer {

	public static final String TITULO_CONTIGENCIA_CONTROLLER = "editarContigencia.window.title";

	private static final long serialVersionUID = 1L;
	
	private static Logger log = LogManager.getLogger(EditarContigenciaController.class);
	
	@Autowired
	private EstadoService estadoService;
	@Autowired
	private ConstanteService constanteService;
	
	private List<Estado> lsEstado;
	
	private Combobox cmbEmpresa;
	private Combobox cmbEstado;
	private List<Empresa> lsEmpresas;
	private MyListbox historicoList;
	private Button btnContingencia;
	private Textbox txtMotivo;
	private Textbox txtStatus;
	private EStatusContingencia statusContigencia;
	private Radiogroup rdbGroup;
	private Radio rdbProducao;
	private Radio rdbHomologacao;
	
	private Paging pagingHistorico;
	@Autowired
	private transient PagedListWrapper<LogHistoricoContingencia> plwLogContingencia;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEstado = estadoService.obtenerTodos();
		
		lsEmpresas = UsuarioLogado.getUsuarioLogado().getEmpresa();
		
		super.doAfterCompose(comp);
		historicoList.setItemRenderer(new RenderHistoricoContingencia());
		
		txtStatus.setDisabled(true);
		
		cmbEmpresa.addEventListener(TypeEventListener.ON_CHANGE.getEvent(), new EventListenerOnChangeContingenciaComboEmpresa());
		
		cmbEstado.addEventListener(TypeEventListener.ON_CHANGE.getEvent(), new EventListenerOnChangeContingenciaComboEstado());
		
		rdbGroup.addEventListener(TypeEventListener.ON_CHECK.getEvent(), new EventListenerOnClickContingenciaRadioAmbiente());
		
		btnContingencia.setDisabled(true);
		
		btnContingencia.addEventListener(TypeEventListener.ON_CLICK.getEvent(), new EventListenerOnClickContingenciaBotaoContingencia(this));
		
		Constante constante = constanteService.buscarPorNomeConstante(Constantes.BPE_AMBIENTE);
		String valorConstante = constante.getValorconstante();
		
		if (valorConstante != null) {
			if (valorConstante.equals("1")) {
				// Producao
				rdbProducao.setSelected(true);
				rdbHomologacao.setDisabled(true);

			} else if (valorConstante.equals("2")) {
				// Homlogacao
				rdbHomologacao.setSelected(true);
				rdbProducao.setDisabled(true);
			}
		} else {
			rdbProducao.setSelected(true);
		}
	}
	
	private void verificarStatus(String uf, String cnpj) {
		Constante constante = constanteService.buscarPorNomeConstante(Constantes.BPE_URL);
		String bpeURL = constante.getValorconstante();
		setStatusContigencia(EStatusContingencia.getStatusContingencia(
				ContingenciaClienteRest.getInstance().consultar(bpeURL, uf, rdbGroup.getSelectedItem().getValue(), cnpj)));
		txtStatus.setValue(statusContigencia.getDescricao());
		
		btnContingencia.setDisabled(false);
		btnContingencia.setLabel(EStatusContingencia.NORMAL.equals(statusContigencia) ? "SETAR CONTINGENCIA" : "RETIRAR CONTINGENCIA");
	}
	
	protected void buscarHistoricoContigencia() {
		if(cmbEmpresa.getSelectedIndex() < 0 || cmbEstado.getSelectedIndex() < 0) {
			log.info("Não foi selecionado empresa e/ou estado");
			return;
		}
		
		txtMotivo.setValue("");
		
		HibernateSearchObject<LogHistoricoContingencia> sistemaBusqueda = new HibernateSearchObject<LogHistoricoContingencia>
			(LogHistoricoContingencia.class, pagingHistorico.getPageSize());
			
		Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
		Empresa empresa = (Empresa) itemEmpresa.getValue();
		
		sistemaBusqueda.addFilter(Filter.equal("empresa", empresa));
		
		Comboitem itemEstado = cmbEstado.getSelectedItem();
		Estado estado = (Estado) itemEstado.getValue();
		
		sistemaBusqueda.addFilter(Filter.equal("estado", estado));
		
		sistemaBusqueda.addSortDesc("logHistoricoContingenciaId");
		
		plwLogContingencia.init(sistemaBusqueda, historicoList, pagingHistorico);		

		//Verifica o status do estado e seta os labels do botao e status
		verificarStatus(estado.getCveestado(), StringHelper.retornaSomenteNumeros(empresa.getCnpj()));
	}

	protected Estado getEstadoSelecionado() {
		return (Estado) getCmbEstado().getSelectedItem().getValue();
	}

	protected Empresa getEmpresaSelecionada() {
		return (Empresa) getCmbEmpresa().getSelectedItem().getValue();
	}

	protected String getNovoStatus() {
		if (EStatusContingencia.NORMAL.equals(getStatusContigencia())) {
			return EStatusContingencia.CONTINGENCIA.getId().toString();
		}
		return EStatusContingencia.NORMAL.getId().toString();
	}
	
	public List<Estado> getLsEstado() {
		return lsEstado;
	}

	public void setLsEstado(List<Estado> lsEstado) {
		this.lsEstado = lsEstado;
	}
	
	public Combobox getCmbEmpresa() {
		return cmbEmpresa;
	}

	public void setCmbEmpresa(Combobox cmbEmpresa) {
		this.cmbEmpresa = cmbEmpresa;
	}

	public List<Empresa> getLsEmpresas() {
		return lsEmpresas;
	}

	public void setLsEmpresas(List<Empresa> lsEmpresas) {
		this.lsEmpresas = lsEmpresas;
	}

	public Combobox getCmbEstado() {
		return cmbEstado;
	}

	public void setCmbEstado(Combobox cmbEstado) {
		this.cmbEstado = cmbEstado;
	}

	public MyListbox getHistoricoList() {
		return historicoList;
	}

	public void setHistoricoList(MyListbox historicoList) {
		this.historicoList = historicoList;
	}

	public Paging getPagingHistorico() {
		return pagingHistorico;
	}

	public void setPagingHistorico(Paging pagingHistorico) {
		this.pagingHistorico = pagingHistorico;
	}

	public Button getBtnContingencia() {
		return btnContingencia;
	}

	public void setBtnContingencia(Button btnContingencia) {
		this.btnContingencia = btnContingencia;
	}

	public Textbox getTxtMotivo() {
		return txtMotivo;
	}

	public void setTxtMotivo(Textbox txtMotivo) {
		this.txtMotivo = txtMotivo;
	}

	public Textbox getTxtStatus() {
		return txtStatus;
	}

	public void setTxtStatus(Textbox txtStatus) {
		this.txtStatus = txtStatus;
	}
	
	public Radiogroup getRdbGroup() {
		return rdbGroup;
	}
	
	public void setRdbGroup(Radiogroup rdbGroup) {
		this.rdbGroup = rdbGroup;
	}

	public Radio getRdbProducao() {
		return rdbProducao;
	}

	public void setRdbProducao(Radio rdbProducao) {
		this.rdbProducao = rdbProducao;
	}

	public Radio getRdbHomologacao() {
		return rdbHomologacao;
	}

	public void setRdbHomologacao(Radio rdbHomologacao) {
		this.rdbHomologacao = rdbHomologacao;
	}

	public EStatusContingencia getStatusContigencia() {
		return statusContigencia;
	}

	public void setStatusContigencia(EStatusContingencia statusContigencia) {
		this.statusContigencia = statusContigencia;
	}

	private final class EventListenerOnClickContingenciaRadioAmbiente implements EventListener {
		@Override
		public void onEvent(Event arg0) throws Exception {
			buscarHistoricoContigencia();
		}
	}
	
	private final class EventListenerOnChangeContingenciaComboEstado implements EventListener {
		@Override
		public void onEvent(Event arg0) throws Exception {
			buscarHistoricoContigencia();
		}
	}

	private final class EventListenerOnChangeContingenciaComboEmpresa implements EventListener {
		@Override
		public void onEvent(Event arg0) throws Exception {
			buscarHistoricoContigencia();
		}
	}
	
}
