package com.rjconsultores.ventaboletos.web.gui.controladores.esquemaoperacional;

import java.util.Arrays;
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.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.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.ConfComprovantePassagem;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.enums.EnumTipoIntegracao;
import com.rjconsultores.ventaboletos.enums.EnumViaComprovantePassagem;
import com.rjconsultores.ventaboletos.service.ConfComprovantePassagemService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MensagensUtils;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Controller("editarIntegracaoCompPassagemController")
@Scope("prototype")
public class EditarIntegracaoCompPassagemController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	private static Logger log = LogManager.getLogger(EditarIntegracaoCompPassagemController.class);

	@Autowired
	private ConfComprovantePassagemService confCompPassService;

	private List<EnumTipoIntegracao> lsTipoIntegracao;
	private Combobox cmbTipoIntegracao;
	
	private List<EnumViaComprovantePassagem> lsViaComprovante;
	private Combobox cmbViaComprovante;

	private Combobox cmbEmpresa;
	private List<Empresa> lsEmpresas;
	
	private Textbox txtURL;
	private Textbox txtApiKey;
	private Textbox txtRemetente;
	private Textbox txtNomeTemplate;
	private Textbox txtIdiomaTemplate;

	private ConfComprovantePassagem confCompPass;
	private BusquedaIntegracaoCompPassagemController busquedaIntegracaoCompPassagem;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		confCompPass = (ConfComprovantePassagem) Executions.getCurrent().getArg().get("ConfComprovantePassagem");
		busquedaIntegracaoCompPassagem = (BusquedaIntegracaoCompPassagemController) Executions.getCurrent().getArg().get("busquedaIntegracaoCompPassagem");
		lsEmpresas = UsuarioLogado.getUsuarioLogado().getEmpresa();
		
		lsTipoIntegracao = Arrays.asList(EnumTipoIntegracao.values());
		lsViaComprovante = Arrays.asList(EnumViaComprovantePassagem.values());

		super.doAfterCompose(comp);
		preencherTela();
	}

	private void preencherTela() {
		if (confCompPass != null && confCompPass.getEmpresa() != null) {
			cmbEmpresa.setText(confCompPass.getEmpresa().getNombempresa());
			txtURL.setText(confCompPass.getUrl());
			txtApiKey.setText(confCompPass.getApiKey());
			txtRemetente.setText(confCompPass.getRemetente());
			txtNomeTemplate.setText(confCompPass.getNomeTemplate());
			txtIdiomaTemplate.setText(confCompPass.getIdiomaTemplate());
			cmbTipoIntegracao.setText(confCompPass.getTipoIntegracao());
			cmbViaComprovante.setText(confCompPass.getViaComprovante());
		}
	}

	public void onClick$btnSalvar(Event ev) {
		cmbEmpresa.getValue();
		try {
			if (confCompPass != null) {
				Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
				Empresa empresa = (Empresa) itemEmpresa.getValue();
				
				Comboitem itemIntegracao = cmbTipoIntegracao.getSelectedItem();
				EnumTipoIntegracao tipoIntegracao = (EnumTipoIntegracao) itemIntegracao.getValue();
				
				Comboitem itemViaComprovante = cmbViaComprovante.getSelectedItem();
				EnumViaComprovantePassagem viaComprovante = (EnumViaComprovantePassagem) itemViaComprovante.getValue();
				
				confCompPass.setTipoIntegracao(tipoIntegracao.toString());
				confCompPass.setViaComprovante(viaComprovante.toString());
				confCompPass.setEmpresa(empresa);
				confCompPass.setUrl(txtURL.getText().trim());
				confCompPass.setApiKey(txtApiKey.getText().trim());
				confCompPass.setRemetente(txtRemetente.getText().trim());
				confCompPass.setNomeTemplate(txtNomeTemplate.getText().trim());
				confCompPass.setIdiomaTemplate(txtIdiomaTemplate.getText().trim());
				
				confCompPass.setActivo(true);

				if (!validaConfiguracaoExistente(confCompPass)) {
					MensagensUtils.showMessageError("editarIntComprovantePassagem.MSG.cadastroExistente", "editarIntComprovantePassagem.window.title");
					return;
				}

				confCompPass = confCompPassService.suscribirActualizar(confCompPass);
				MensagensUtils.showMessageExclamation("editarIntComprovantePassagem.MSG.suscribirOK", "editarIntComprovantePassagem.window.title");
				busquedaIntegracaoCompPassagem.refreshLista();
				this.closeWindow();
			}

		} catch (Exception e) {
			log.error("Erro ao salvar configuração de Integração de comprovante de passagem: ", e);
			MensagensUtils.showMessageError("editarConvenioController.MSG.erro", "editarIntComprovantePassagem.window.title");
		}
	}

	private boolean validaConfiguracaoExistente(ConfComprovantePassagem confPass) {

		ConfComprovantePassagem existente = confCompPassService.buscarConfiguracao(confPass.getEmpresa().getEmpresaId(), confPass.getTipoIntegracao(), confPass.getViaComprovante());
		
		if (existente != null && confPass.getConfComprovantePassagemId() == null) {
			return false;
		}
		if(existente != null && !confPass.getConfComprovantePassagemId().equals(existente.getConfComprovantePassagemId())) {
			return false;
		}
		
		return true;
	}

	public void onClick$btnApagar(Event ev) {
		try {
			if (!(confCompPass != null && confCompPass.getConfComprovantePassagemId() != null)) {
				return;
			}

			if (Messagebox.YES == MensagensUtils.showMessageQuestion("editarIntComprovantePassagem.MSG.borrarPergunta", "editarIntComprovantePassagem.window.title")) {
				confCompPass.setActivo(Boolean.FALSE);
				confCompPassService.suscribirActualizar(confCompPass);
				MensagensUtils.showMessageExclamation("editarIntComprovantePassagem.MSG.borrarOK", "editarIntComprovantePassagem.window.title");
				cmbEmpresa.setSelectedIndex(-1);
				confCompPass = null;
				busquedaIntegracaoCompPassagem.refreshLista();
				this.closeWindow();
			}
			
		} catch (Exception ex) {
			log.error("Erro ao apagar configuração de Integração de comprovante de passagem: ", ex);
		}
	}

	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 List<EnumViaComprovantePassagem> getLsViaComprovante() {
		return lsViaComprovante;
	}

	public void setLsViaComprovante(List<EnumViaComprovantePassagem> lsViaComprovante) {
		this.lsViaComprovante = lsViaComprovante;
	}

	public Combobox getCmbViaComprovante() {
		return cmbViaComprovante;
	}

	public void setCmbViaComprovante(Combobox cmbViaComprovante) {
		this.cmbViaComprovante = cmbViaComprovante;
	}

	public Textbox getTxtURL() {
		return txtURL;
	}

	public void setTxtURL(Textbox txtURL) {
		this.txtURL = txtURL;
	}

	public Textbox getTxtApiKey() {
		return txtApiKey;
	}

	public void setTxtApiKey(Textbox txtApiKey) {
		this.txtApiKey = txtApiKey;
	}

	public Textbox getTxtRemetente() {
		return txtRemetente;
	}

	public void setTxtRemetente(Textbox txtRemetente) {
		this.txtRemetente = txtRemetente;
	}

	public Textbox getTxtNomeTemplate() {
		return txtNomeTemplate;
	}

	public void setTxtNomeTemplate(Textbox txtNomeTemplate) {
		this.txtNomeTemplate = txtNomeTemplate;
	}
	
	public Textbox getTxtIdiomaTemplate() {
		return txtIdiomaTemplate;
	}

	public void setTxtIdiomaTemplate(Textbox txtIdiomaTemplate) {
		this.txtIdiomaTemplate = txtIdiomaTemplate;
	}

	public List<EnumTipoIntegracao> getLsTipoIntegracao() {
		return lsTipoIntegracao;
	}

	public void setLsTipoIntegracao(List<EnumTipoIntegracao> lsTipoIntegracao) {
		this.lsTipoIntegracao = lsTipoIntegracao;
	}

	public Combobox getCmbTipoIntegracao() {
		return cmbTipoIntegracao;
	}

	public void setCmbTipoIntegracao(Combobox cmbTipoIntegracao) {
		this.cmbTipoIntegracao = cmbTipoIntegracao;
	}

	public ConfComprovantePassagemService getConfCompPassService() {
		return confCompPassService;
	}

	public void setConfCompPassService(ConfComprovantePassagemService confCompPassService) {
		this.confCompPassService = confCompPassService;
	}

	public ConfComprovantePassagem getConfCompPass() {
		return confCompPass;
	}

	public void setConfCompPass(ConfComprovantePassagem confCompPass) {
		this.confCompPass = confCompPass;
	}
	
}
