package com.rjconsultores.ventaboletos.web.utilerias.api;

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.zkoss.util.resource.Labels;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Usuario;
import com.rjconsultores.ventaboletos.enums.CacheApiEnum;
import com.rjconsultores.ventaboletos.service.ConstanteService;
import com.rjconsultores.ventaboletos.service.UsuarioEmpresaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.spring.AppContext;

public class CacheOperadorEmbarcada {
	
	private static CacheOperadorEmbarcada instance;

	public final String URL_API_EMB = "URL_API_EMB";
	
	private static Logger log = LogManager.getLogger(CacheOperadorEmbarcada.class);
	
	public static CacheOperadorEmbarcada getInstance() {
		if(instance == null) {
			instance = new CacheOperadorEmbarcada();
		}
		
		return instance;
	}
	
	public void limparCacheOperador(String OperadorId, String senha, Usuario usuario) {
		try {
			log.info("Inicio limparCacheOperador, OperadorId: " + OperadorId);
			CacheApiEnum entidade = CacheApiEnum.OPERADOR_ESPECIFICO;
			
			String[] urls = getURLSAPI();
			
			if (urls == null || urls.length == 0) {
				log.info(Labels.getLabel("limparCacheAPI.message.naoconfigurado"));
				return;
			}
			
			Usuario user = UsuarioLogado.getUsuarioLogado();
			
			List<Empresa> empresas = buscarEmpresas(usuario);
			
			for (String url : urls) {

				if (StringUtils.isBlank(url) || url.contains("|")) {
					log.info(Labels.getLabel("limparCacheAPI.message.naoconfigurado"));
					return;
				}
				
				String tenant = StringUtils.substringBetween(url, "[", "]");
				if (tenant != null) {
					url = url.replaceAll("\\[.*?\\]", "");
				}
				String urlBase = url;
				
				for(Empresa emp : empresas) {
					
					url = montarUrlRequest(url, entidade.getUri(), OperadorId, emp.getEmpresaId());
					
					log.info("URL: " + url);
					
					ApiCallRunnable cache = new ApiCallRunnable(
							url, 
							tenant, 
							urlBase, 
							user.getClaveUsuario(),
							senha, 
							ETipoEnvio.DELETE);
					
					Thread thread = new Thread(cache);
					thread.start();
					thread.join();
					
					log.info(cache.getRetorno());
				}
			}
			
			log.info("Final limparCacheOperador, OperadorId: " + OperadorId);
		} catch (Exception e) {
			log.error("Erro ao limpar cache operador embarcada", e);
		}
	}
	
	private String montarUrlRequest(String url, String uri, String OperadorId, Integer empresaId) {
		url = url.toLowerCase();

		if (!url.endsWith("/")) {
			url += "/";
		}
		
		uri = uri.replace("operador_id", OperadorId);
		uri = uri.replace("empresa_id", empresaId.toString());

		return url.concat(uri);
	}
	
	private List<Empresa> buscarEmpresas(Usuario usuario) {
		ApplicationContext appContext = AppContext.getApplicationContext();
		UsuarioEmpresaService usuarioEmpService = (UsuarioEmpresaService) appContext.getBean("usuarioEmpresaService");
		
		return usuarioEmpService.obtenerEmpresa(usuario);
	}
	
	private String[] getURLSAPI() {
		ApplicationContext appContext = AppContext.getApplicationContext();
		ConstanteService constanteService = (ConstanteService) appContext.getBean("constanteService");
		String constante = constanteService.buscarURLAPIEmb();

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

}
