package com.rjconsultores.ventaboletos.web.gui.controladores.seguridad.api;

import java.util.Arrays;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.context.ApplicationContext;
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.event.Event;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Messagebox;

import com.rjconsultores.ventaboletos.entidad.Usuario;
import com.rjconsultores.ventaboletos.enums.CacheApiEnum;
import com.rjconsultores.ventaboletos.service.ConstanteService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.InputMessageBox;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.api.ApiCallRunnable;
import com.rjconsultores.ventaboletos.web.utilerias.api.ETipoEnvio;
import com.rjconsultores.ventaboletos.web.utilerias.spring.AppContext;

/**
 * 
 * @author Fabio Faria
 */
@Controller("limparCacheApiController")
@Scope("prototype")
public class LimparCacheApiController extends MyGenericForwardComposer {

	private static final String TITULO = "limparCacheAPI.title";
	private static final long serialVersionUID = 1L;
	private static Logger log = LogManager.getLogger(LimparCacheApiController.class);

	private List<CacheApiEnum> lsCachesApiEnum;
	private Combobox cmbItem;


	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);	

		setLsCachesApiEnum(Arrays.asList(CacheApiEnum.values()));
	}
	
	public void onClick$btnRecarregar(Event ev) throws Exception {
		Comboitem cbiEntidade = cmbItem.getSelectedItem();
		if (cbiEntidade != null) {
			CacheApiEnum entidade = (CacheApiEnum) cbiEntidade.getValue();
			recarregarCache(entidade);
		}
	}
	
	public Combobox getCmbItem() {
		return cmbItem;
	}

	public void setCmbItem(Combobox cmbItem) {
		this.cmbItem = cmbItem;
	}

	public List<CacheApiEnum> getLsCachesApiEnum() {
		return lsCachesApiEnum;
	}

	public void setLsCachesApiEnum(List<CacheApiEnum> lsCachesApiEnum) {
		this.lsCachesApiEnum = lsCachesApiEnum;
	}
	
	public void recarregarCache( CacheApiEnum entidade) {

		try {

			int resp = Messagebox.show(
					Labels.getLabel("limparCacheAPI.message.pergunta"),
					Labels.getLabel(TITULO), Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (resp == Messagebox.YES) {

				String[] urls = getURLSAPI();

				if (urls == null || urls.length == 0) {
					Clients.alert(Labels.getLabel("limparCacheAPI.message.naoconfigurado"),
								  Labels.getLabel(TITULO), Messagebox.INFORMATION);
					return;
				}
				
				String secret = InputMessageBox.showQuestion(
						Labels.getLabel("limparCacheAPI.message.senha"), 
						Labels.getLabel(TITULO), 
						Messagebox.OK);

				for (String url : urls) {

					if (StringUtils.isBlank(url) || url.contains("|")) {
						Clients.alert(Labels.getLabel("limparCacheAPI.message.naoconfigurado"),
								      Labels.getLabel(TITULO), Messagebox.INFORMATION);
						return;
					}

					String tenant = StringUtils.substringBetween(url, "[", "]");
					if (tenant != null) {
						url = url.replaceAll("\\[.*?\\]", "");
					}
					String urlBase = url;
					url = montarUrlRequest(url, entidade.getUri());
					
					Usuario user = UsuarioLogado.getUsuarioLogado();

					ApiCallRunnable cache = new ApiCallRunnable(
														url, 
														tenant, 
														urlBase, 
														user.getClaveUsuario(), 
														secret, 
														ETipoEnvio.POST);
					Thread thread = new Thread(cache);
					thread.start();
					thread.join();

					Clients.alert(cache.getRetorno(), Labels.getLabel(TITULO), Messagebox.INFORMATION);
				}

			}

		} catch (Exception e) {
			Clients.alert(e.getMessage(), Labels.getLabel(TITULO), Messagebox.ERROR);
			log.error(e.getMessage(), e);
		}

	}
	
	private String montarUrlRequest(String url, String uri) {

		url = url.toLowerCase();

		if (!url.endsWith("/")) {
			url += "/";
		}

		return url.concat(uri);
	}

	private String[] getURLSAPI() {
		ApplicationContext appContext = AppContext.getApplicationContext();
		ConstanteService constanteService = (ConstanteService) appContext.getBean("constanteService");
		String constante = constanteService.buscarURLAPIEmb();

		return constante == null ? null : constante.split("\\|");
	}
}
