package br.mp.mprj.portal.portlet.gestaomensagens.util;

import java.util.Arrays;

import javax.portlet.PortletRequest;
import javax.portlet.PortletSession;

import com.liferay.portal.kernel.json.JSONArray;
import com.liferay.portal.kernel.upload.UploadPortletRequest;
import com.liferay.portal.kernel.util.Digester;
import com.liferay.portal.kernel.util.DigesterUtil;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;

public class GestaoMensagensUtil {
	
	/**
	 * Express&atilde;o regular para substituir caracteres desnecess&aacute;rios do texto convertido a partir de um Array.
	 */
	public static final String REGEXP_ARRAY = "\\[|\\]|,";
	
	/**
	 * Express&atilde;o regular para ser utilizado como delimitador ao fazer split de String para String[]. 
	 */
	public static final String REGEXP_SEPARADOR_ESPACO = "\\s";
	
	/**
	 * Express&atilde;o regular utilizado como separador em alguns conte&uacute;dos, como bairros enviados pelo WebService SOAP.
	 */
	public static final String REGEXP_SEPARADOR_PIPE = "\\|";
	
	private static final String PREFIXO_TOKEN = "ZAPCARIOCA|";

	
	/**
	 * Transforma um array em tokens de String, com base em par&acirc;metro do request.
	 * @param req
	 * @param parametro - nome do par&acirc;metro a ser obtido da requisi&ccedil;&atilde;o.
	 * @return String - valores separados por espa&ccedil;o.
	 */
	public static String parseArrayString(PortletRequest req, String parametro) {
		String valores = ParamUtil.getString(req, parametro);
		if (Validator.isNotNull(valores) 
				&& valores.indexOf(StringPool.COMMA) >= 0) {
			return parseArrayString(valores.split(StringPool.COMMA));
		}
		return parseArrayString(ParamUtil.getParameterValues(req, parametro));
	}
	
	/**
	 * Transforma um array em tokens de String, com base em par&acirc;metro do request.
	 * @param req
	 * @param parametro - nome do par&acirc;metro a ser obtido da requisi&ccedil;&atilde;o.
	 * @return String - valores separados por espa&ccedil;o.
	 */
	public static String parseArrayString(UploadPortletRequest uploadReq, String parametro) {
		
		String valores = ParamUtil.getString(uploadReq, parametro);
		if (Validator.isNotNull(valores) 
				&& valores.indexOf(StringPool.COMMA) >= 0) {
			return parseArrayString(valores.split(StringPool.COMMA));
		}
		return parseArrayString(ParamUtil.getParameterValues(uploadReq, parametro));
	}
	
	/**
	 * Transforma um array em tokens de String.
	 * @param parametro - nome do par&acirc;metro a ser obtido da requisi&ccedil;&atilde;o.
	 * @return String - valores separados por espa&ccedil;o.
	 */
	public static String parseArrayString(String[] valores) {
		if (valores == null) return StringPool.BLANK;
		String temp = Arrays.toString(valores);
		return temp.replaceAll(REGEXP_ARRAY, StringPool.BLANK);
	}
	
	/**
	 * Converte um string separado por espa&ccedil;o em array de String.
	 * @param texto
	 * @return String[]
	 */
	public static String[] parseStringArray(String texto) {
		return texto.split(REGEXP_SEPARADOR_ESPACO);
	}

	/**
	 * Converte um {@link JSONArray} em String[]
	 * @param jsonArray
	 * @return String[] - null se o jsonArray for nulo ou estiver com length = 0.
	 */
	public static String[] parseStringArray(JSONArray jsonArray) {
		if (jsonArray == null || jsonArray.length() == 0) return null;
		int qtd = jsonArray.length();
		String[] result = new String[qtd];
		for (int i = 0; i < qtd; i++) {
			result[i] = jsonArray.getString(i);
		}
		return result;
	}
	
	/**
	 * Converte um {@link JSONArray} em String com valores separados por espa&ccedil;o.
	 * @param jsonArray
	 * @return String
	 */
	public static String parseArrayString(JSONArray jsonArray) {
		String[] array = parseStringArray(jsonArray);
		return parseArrayString(array);
	}
	
	public static String gerarTokenSistema(String nomeSistema) {
		if (Validator.isNull(nomeSistema)) return null;
		String key = PREFIXO_TOKEN + nomeSistema.toUpperCase() + StringPool.PIPE + System.currentTimeMillis();
		return DigesterUtil.digestHex(Digester.MD5, key);
	}
	
	public static void descartarRascunhos(final PortletRequest req){
		
		PortletSession session = null;
		
		if (req != null){
			session = req.getPortletSession();
		}
		
		if (session != null){
			session.removeAttribute("mensagem");
			session.removeAttribute("rascunhoRecuperado");
			session.removeAttribute("edicao");
		}
	}


}
