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

import java.util.List;

import javax.portlet.PortletRequest;

import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.upload.UploadPortletRequest;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.PropsUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.model.PortletPreferences;
import com.liferay.portal.service.PortletPreferencesLocalServiceUtil;
import com.liferay.portal.util.PortalUtil;
import com.liferay.portlet.PortletPreferencesFactoryUtil;
import com.liferay.util.portlet.PortletProps;

/**
 * Classe utilit&aacute;ria para envio de e-mails pelo portlet.
 * @author Henrique Simoes
 *
 */
public class EmailUtil {
	
	private static final Log _log = LogFactoryUtil.getLog(EmailUtil.class);
	private static final String REGEXP_URL_RELATIVA = "(\"|\')(/)";
	private static final String PORTLET_ID = "portletgestaomensagens_WAR_portletgestaomensagens";
	/**
	 * Nome da propridade nos arquivos portlet.properties e portal-ext.properties, bem como no {@link PortletPreferences}.
	 */
	private static final String PROPRIEDADE_URL_SERVIDOR = "configuracao.email.url-servidor";
	
	/**
	 * Transforma as URL's relativas em absolutas, utilizando como base a url do Portal.
	 * @param html
	 * @return String
	 */
	public static String definirUrlAbsoluta(PortletRequest req, String html) {
		if (Validator.isNotNull(html)) {
			return html.replaceAll(REGEXP_URL_RELATIVA, "$1" + PortalUtil.getPortalURL(req) + "$2");
		}
		return html;		
	}
	
	/**
	 * Transforma as URL's relativas em absolutas, utilizando como base a url do Portal.
	 * @param html
	 * @return String
	 */
	public static String definirUrlAbsoluta(UploadPortletRequest uploadReq, String html) {
		if (Validator.isNotNull(html)) {
			return html.replaceAll(REGEXP_URL_RELATIVA, "$1" + PortalUtil.getPortalURL(uploadReq) + "$2");
		}
		return html;		
	}
	
	/**
	 * Retorna a URL do servidor para montar o link do e-mail dos aprovadores, <br>
	 * para abrir a p&aacute;gina de aprova&ccedil;&atilde;o/reprova&ccedil;&atilde;o da mensagem. <br>
	 * Ordem de verifica&ccedil;&atilde;o: <br>
	 * 1 - configura&ccedil;&atilde;o do portal (porta-ext.properties), <br> 
	 * 2 - configura&ccedil;&atilde;o do portlet, <br>
	 * 3 - portlet.properties.
	 * @param companyId
	 * @param groupId
	 * @return String - URL do servidor do portal, para ser utilizado nos e-mail enviados pelo job de agendamento e workflow.
	 */
	public static String getURLServidor(long companyId, long groupId) {
		//verifica se existe propriedade no portal-ext.properties
		String url = GetterUtil.getString(PropsUtil.get(PROPRIEDADE_URL_SERVIDOR));
		
		if (Validator.isNull(url)) {
			try {
				//identifica as preferencias do portlet, passando como argumento o plid (Layout ID) como zero (0),
				//ja que eh definido pelo painel de controle.
				List<PortletPreferences> listPrefs = PortletPreferencesLocalServiceUtil.getPortletPreferences(0, PORTLET_ID);
				
				if (listPrefs.size() > 0) {
					PortletPreferences liferayPrefs = listPrefs.get(0);
					//obtem a referencia adequada das preferences, da interface javax.portlet,
					//com todas as preferencias mapeadas do XML recuperado do banco de dados.
					javax.portlet.PortletPreferences prefs = PortletPreferencesFactoryUtil
																	.fromXML(companyId, //companyId
																			groupId,  //ownerId, neste caso eh o ID do site no painel de controle
																			2, //ownerType - painel de controle
																			0,  //plid - ID do Layout, 0 para painel de controle
																			PORTLET_ID, 
																			liferayPrefs.getPreferences());
					url = prefs.getValue(PROPRIEDADE_URL_SERVIDOR, StringPool.BLANK);
				}
			}
			catch (SystemException ex) {
				_log.error("Problemas ao obter URL do Servidor para e-mail:", ex);
				url = StringPool.BLANK;
			}
			finally {
				//retorna o valor do portlet.properties, caso as tentativas anteriores seja nulo.
				if (Validator.isNull(url)) {
					url = GetterUtil.getString(PortletProps.get(PROPRIEDADE_URL_SERVIDOR));
				}				
			}
		}
		
		return url;
	}

}
