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

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

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

import br.mp.mprj.portal.portlet.gestaomensagens.service.model.AnexoMensagem;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.Mensagem;
import br.mp.mprj.portal.portlet.gestaomensagens.service.service.AnexoMensagemLocalServiceUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.util.DocumentFileUtil;
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.workflow.StatusWorkflowEnum;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
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.upload.FileItem;
import com.liferay.portal.kernel.upload.UploadPortletRequest;
import com.liferay.portal.kernel.util.MimeTypesUtil;
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.util.PortalUtil;
import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
import com.liferay.portlet.documentlibrary.model.DLFileEntry;
import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;

/**
 * ActionCommand representando o segundo passo do wizard: Preencher dados da
 * Mensagem.
 * 
 * @author HenriqueSimoes
 *
 */
public class WizardMensagemDadosActionCommand extends WizardBaseActionCommand {

	private static final String NOME_PASTA_ANEXOS = "anexos-mensagens";

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

		super.processCommand(req, res);

		UploadPortletRequest reqUpload = PortalUtil
				.getUploadPortletRequest(req);

		Mensagem mensagem = getMensagem(req, reqUpload);
		req.setAttribute(WebKeys.REDIRECT,
				ParamUtil.getString(reqUpload, "redirect"));

		try {
			preencherMensagemRequest(reqUpload, mensagem);
			gravarMensagem(req, mensagem);
			List<AnexoMensagem> anexos = loadFile(req, reqUpload,
					mensagem.getMensagemId());
			if (anexos != null) {
				AnexoMensagemLocalServiceUtil.atualizaAnexos(anexos);

			}
			return true;
		} catch (PortalException | SystemException | IOException ex) {
			SessionErrors.add(req, "erro-wizard-dados-mensagem");
			GestaoMensagensUtil.descartarRascunhos(req);
			return false;
		}
	}

	private void preencherMensagemRequest(UploadPortletRequest uploadReq,
			Mensagem mensagem) {

		mensagem.setAssunto(ParamUtil.getString(uploadReq, "assunto"));
		mensagem.setConteudo(EmailUtil.definirUrlAbsoluta(uploadReq,
				ParamUtil.getString(uploadReq, "conteudo")));
		mensagem.setTemplateId(ParamUtil.getLong(uploadReq, "templateId"));
		mensagem.setContaSaidaId(ParamUtil.getLong(uploadReq, "contaSaidaId"));
		mensagem.setGrupoDestinatarioIds(GestaoMensagensUtil.parseArrayString(
				uploadReq, "grupoDestinatariosSearchContainerPrimaryKeys"));
		mensagem.setNomeSolicitante(ParamUtil.getString(uploadReq,
				"nomeSolicitante"));
		mensagem.setPrioridade(ParamUtil.getInteger(uploadReq, "prioridadeId"));

		boolean preAprovado = ParamUtil.getBoolean(uploadReq, "checkAprovacao");

		if (preAprovado) {
			mensagem.setStatusWorkflow(StatusWorkflowEnum.APROVADO.getStatus());
		}
	}

	/**
	 * Carrega uma lista de anexos enviados para a mensagem.
	 */
	private List<AnexoMensagem> loadFile(final PortletRequest portletRequest,
			final UploadPortletRequest reqUpload, long mensagemId)
			throws SystemException, PortalException, IOException {

		if (ParamUtil.getInteger(reqUpload, "temAnexos") == 1) {

			final Map<String, FileItem[]> files = reqUpload
					.getMultipartParameterMap();
			final List<AnexoMensagem> anexos = new ArrayList<AnexoMensagem>();

			for (Entry<String, FileItem[]> current : files.entrySet()) {

				FileItem item[] = current.getValue();

				for (FileItem fileItem : item) {

					AnexoMensagem anexoMensagem = AnexoMensagemLocalServiceUtil
							.criarAnexo(portletRequest);

					// Associando o anexo a mensagem corrente.
					anexoMensagem.setMensagemId(mensagemId);

					File file = fileItem.getStoreLocation();

					DocumentFileUtil documentFileUtil = new DocumentFileUtil(
							anexoMensagem.getGroupId(),
							anexoMensagem.getUserId(), portletRequest);

					FileEntry fileEntry = getFileUpload(file,
							fileItem.getFileName(), anexoMensagem,
							documentFileUtil);

					anexoMensagem.setAnexoFileEntryId(fileEntry
							.getFileEntryId());
					anexoMensagem.setAnexoUrl(documentFileUtil
							.criarUrlArquivo(fileEntry));
					anexoMensagem.setVersao(fileEntry.getVersion());
					anexoMensagem.setFileName(fileItem.getFileName());
					anexoMensagem.setContentType(fileItem.getContentType());
					anexoMensagem.setAtivo(true);

					anexos.add(anexoMensagem);
				}

			}
			return anexos;
		}

		return null;
	}

	private FileEntry getFileUpload(File file, String nomeArquivo,
			AnexoMensagem anexoMensagem, DocumentFileUtil documentFileUtil)
			throws IOException, PortalException, SystemException {

		if (file != null) {

			Folder folder = documentFileUtil.verificarPastaArquivos(
					documentFileUtil.getIdPastaPrincipal(), NOME_PASTA_ANEXOS,
					StringPool.BLANK);

			String fileName = nomeArquivo + "-"
					+ String.valueOf(anexoMensagem.getMensagemId());
			anexoMensagem.setFileName(fileName);

			try {
				FileEntry entry = documentFileUtil.getArquivoPorNome(
						anexoMensagem.getGroupId(), folder.getFolderId(),
						fileName);

				if (entry == null) {
					entry = documentFileUtil.criarArquivo(folder.getFolderId(),
							fileName, file,
							MimeTypesUtil.getContentType(fileName));
				} else {
					entry = documentFileUtil.atualizarArquivo(
							anexoMensagem.getUserId(), entry.getFileEntryId(),
							fileName, file,
							MimeTypesUtil.getContentType(fileName));
				}

				DLFileEntry dlEntry = DLFileEntryLocalServiceUtil
						.getDLFileEntry(entry.getFileEntryId());
				dlEntry = DLFileEntryLocalServiceUtil
						.updateDLFileEntry(dlEntry);

				return entry;
			} catch (NoSuchFileEntryException ex) {
				return null;
			}
		}

		return null;
	}

	/**
	 * Metodo responsavel por remover a anexos associado a um Mensagem.
	 * 
	 * @param anexos
	 *            -
	 * @param documentFileUtil
	 * @throws SystemException
	 * @throws PortalException
	 */
	public void removeFile(List<AnexoMensagem> anexos,
			DocumentFileUtil documentFileUtil) throws SystemException,
			PortalException {

		for (AnexoMensagem anexo : anexos) {
			documentFileUtil.removerArquivo(anexo.getAnexoFileEntryId());
		}

	}

}
