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

import java.io.File;
import java.io.IOException;
import java.util.Date;

import javax.portlet.PortletException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;

import br.mp.mprj.portal.portlet.gestaomensagens.service.model.Template;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.impl.TemplateImpl;
import br.mp.mprj.portal.portlet.gestaomensagens.service.service.TemplateLocalServiceUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.util.EmailUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.util.GestaoMensagensUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.util.ImagemUtil;

import com.liferay.counter.service.CounterLocalServiceUtil;
import com.liferay.portal.kernel.exception.PortalException;
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.repository.model.FileEntry;
import com.liferay.portal.kernel.repository.model.Folder;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.upload.UploadPortletRequest;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portal.util.PortalUtil;
import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
import com.liferay.util.bridges.mvc.ActionCommand;

public class TemplateAlterarIncluirActionCommand extends WizardTemplateActionCommand implements ActionCommand {
	
	private static final Log _log = LogFactoryUtil.getLog(TemplateAlterarIncluirActionCommand.class);
	
	private static final String NOME_PASTA_THUMBNAIL = "template-thumbnail";

	@Override
	public boolean processCommand(PortletRequest req,
			PortletResponse res) throws PortletException {

		UploadPortletRequest reqUpload = PortalUtil.getUploadPortletRequest(req);

		Template template = null;
		try {
			ThemeDisplay themeDisplay = (ThemeDisplay) reqUpload.getAttribute(WebKeys.THEME_DISPLAY);
			
			long groupId = themeDisplay.getScopeGroupId();
			long companyId = themeDisplay.getCompanyId();
			long userId = themeDisplay.getUserId();
			
			long templateId = ParamUtil.getLong(reqUpload, "templateId");
			
			if (templateId == 0) {
				
				if (templateExiste(templateId, ParamUtil.getString(reqUpload, "nome"), groupId)){
					
					Template modelo = new TemplateImpl();
					
					modelo.setNome(ParamUtil.getString(reqUpload, "nome"));
					modelo.setCabecalho(EmailUtil.definirUrlAbsoluta(req, ParamUtil.getString(reqUpload, "cabecalho")));
					modelo.setRodape(EmailUtil.definirUrlAbsoluta(req, ParamUtil.getString(reqUpload, "rodape")));
					modelo.setCorpo(EmailUtil.definirUrlAbsoluta(req, ParamUtil.getString(reqUpload, "corpo")));
					modelo.setEstilo(ParamUtil.getInteger(reqUpload, "estilo"));
					
					//especifico para o formulario do template
					reqUpload.setAttribute("template", modelo);
					
				    SessionErrors.add(req,"template.nome.existe");
					SessionMessages.add(req, PortalUtil.getPortletId(req) + SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_ERROR_MESSAGE);
					return false;
					
				}
				
				template = TemplateLocalServiceUtil.createTemplate(CounterLocalServiceUtil.increment());
				template.setGroupId(groupId);
				template.setCompanyId(companyId);
				template.setDataCriacao(new Date());
				template.setAtivo(true);
			}
			else {
				template = TemplateLocalServiceUtil.getTemplate(templateId);
				template.setDataAtualizacao(new Date());
			}

			template.setUserId(userId);
			
			preencherObjetoRequest(reqUpload, req, template);		
			
			if (templateExiste(templateId, ParamUtil.getString(reqUpload, "nome"), groupId)){
				
				//especifico para o formulario do template
				reqUpload.setAttribute("template", template);
				
			    SessionErrors.add(req,"template.nome.existe");
				SessionMessages.add(req, PortalUtil.getPortletId(req) + SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_ERROR_MESSAGE);
				return false;
				
			}
			
			template = TemplateLocalServiceUtil.updateTemplate(template);
			
			//especifico para o formulario do template
			reqUpload.setAttribute("template", template);

			if (ParamUtil.getBoolean(reqUpload, "wizard")) {
				//incluir na session para o wizard de nova mensagem.
				//reqUpload.getPortletSession().setAttribute("template", template);				
				req.setAttribute("templateId", template.getTemplateId());
				super.processCommand(req, res);
			}

			SessionMessages.add(req, "template-sucesso-gravar");
			
			//define a URL de redirect no atributo da requisicao, pois com o formulario com enctype para upload,
			//afeta a recuperacao do parametro atraves do PortletRequest. Este atributo sera utilizado pelo sendRedirect do MVCPortlet.
			req.setAttribute(WebKeys.REDIRECT, ParamUtil.getString(reqUpload, "redirect"));
			
			return true;
		}
		catch (Exception ex) {
			_log.error("Problemas ao gravar:", ex);
			SessionErrors.add(req, "erro-gravar");
			req.setAttribute("template", template);
			GestaoMensagensUtil.descartarRascunhos(req);
			return false;
		}
	}
	
	private boolean templateExiste(final long templateId , final String nome, final long groupId){
		
		Template template = TemplateLocalServiceUtil.recuperaTemplatePorNome(nome,groupId);
		boolean  existe = false;
		
		if (template != null){
			
			if (template.getTemplateId() != templateId){
				existe = true;
			}
		} 
		
		return existe;
	}
	
	private void preencherObjetoRequest(UploadPortletRequest upReq, PortletRequest req, Template template)
			throws IOException, PortalException, SystemException {
		template.setNome(ParamUtil.getString(upReq, "nome"));
		template.setCabecalho(EmailUtil.definirUrlAbsoluta(req, ParamUtil.getString(upReq, "cabecalho")));
		template.setRodape(EmailUtil.definirUrlAbsoluta(req, ParamUtil.getString(upReq, "rodape")));
		template.setCorpo(EmailUtil.definirUrlAbsoluta(req, ParamUtil.getString(upReq, "corpo")));
		template.setEstilo(ParamUtil.getInteger(upReq, "estilo"));

		//tratar a imagem de thumbnail
		ImagemUtil imgUtil = new ImagemUtil(template.getGroupId(), template.getUserId(), req, upReq);
		FileEntry fileEntry = getArquivoUpload(upReq, req, template, imgUtil);
		//atualizar apenas se fez upload (obteve arquivo)
		if (fileEntry != null) {
			template.setThumbnailFileEntryId(fileEntry.getFileEntryId());
			template.setThumbnailURL(imgUtil.criarUrlImagem(fileEntry));
		}
	}
	
	/**
	 * Carrega o arquivo do upload e grava no Documentos e Midias, de acordo com a pasta especifica do portlet e thumbnails.
	 * @param upReq
	 * @param req
	 * @param template
	 * @param imgUtil
	 * @return
	 * @throws IOException
	 * @throws PortalException
	 * @throws SystemException
	 */
	private FileEntry getArquivoUpload(UploadPortletRequest upReq, PortletRequest req, Template template, ImagemUtil imgUtil)
			throws IOException, PortalException, SystemException {
		File file = upReq.getFile("imgThumb");
		
		if (file != null && file.length() > 0) {
			//verifica e retorna a pasta de imagens thubmnail de templates do portlet
			Folder folderThumb = imgUtil.verificarPastaImagens(imgUtil.getIdPastaPrincipal(), 
												NOME_PASTA_THUMBNAIL, 
												StringPool.BLANK); 
			
			String fileName = String.valueOf(template.getTemplateId());
			
			FileEntry entry;
			try {
				//verifica se ja existe imagem com o nome especificado, removendo-o caso exista.
				//para manter sempre a ultima versao
				entry = imgUtil.getArquivoPorNome(template.getGroupId(), folderThumb.getFolderId(), fileName);
				imgUtil.removerImagem(entry.getFileEntryId());
			}
			catch (NoSuchFileEntryException ex){}
			
			entry = imgUtil.criarImagem(folderThumb.getFolderId(), 
								fileName, 
								template.getNome(), 
								file, 
								"imgThumb", 
								ImagemUtil.IMAGEM_ALTURA, 
								ImagemUtil.IMAGEM_LARGURA);
			
			return entry;
		}
		
		return null;
	}

}
