/**
 * Copyright (c) 2009-2014 Câmara dos Deputados. Todos os direitos reservados.
 *
 * e-Democracia é um software livre; você pode redistribuí-lo e/ou modificá-lo dentro
 * dos termos da Licença Pública Geral Menor GNU como publicada pela Fundação do 
 * Software Livre (FSF); na versão 2.1 da Licença, ou (na sua opinião) qualquer versão.
 *
 * Este programa é distribuído na esperança de que possa ser  útil, mas SEM NENHUMA GARANTIA;
 * sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR.
 * Veja a Licença Pública Geral Menor GNU para maiores detalhes. 
 */
package br.gov.camara.edemocracia.portlets.guiadiscussao.beans.admin;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.portlet.PortletConfig;

import org.apache.commons.lang3.StringUtils;

import br.gov.camara.edemocracia.portlets.guiadiscussao.model.Configuracao;
import br.gov.camara.edemocracia.portlets.guiadiscussao.service.ConfiguracaoLocalServiceUtil;
import br.gov.camara.edemocracia.portlets.guiadiscussao.util.BibliotecaImagensUtil;

import com.liferay.faces.portal.context.LiferayFacesContext;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.language.LanguageUtil;

@ManagedBean(name = "bannerAdminBean")
@ViewScoped
public class BannerAdminBean implements Serializable {

	private static final long serialVersionUID = -3790226197232888263L;

	// Lista com imagens cadastradas na biblioteca de documentos
	private List<FileEntryDisplay> imagens;
	// Imagem da biblioteca selecionada pelo usuário
	private FileEntryDisplay imagemSelecionada;

	private String tituloBanner;
	private String textoBanner;

	// Utilizados para componente <componente:linkPainel/>
	private Boolean urlExterna;
	private String linkComunidade;
	private String linkExterno;

	@ManagedProperty(value = "#{configuracaoAdminBean}")
	private ConfiguracaoAdminBean configuracaoAdminBean;

	@PostConstruct
	private void init() {
		carregarImagensDaBiblioteca();
		carregarDadosBanner();
	}

	/**
	 * Carrega todas as imagens que estão cadastradas na biblioteca de
	 * documentos da comunidade
	 */
	private void carregarImagensDaBiblioteca() {
		imagens = new ArrayList<FileEntryDisplay>();
		long groupId = LiferayFacesContext.getInstance().getThemeDisplay()
				.getScopeGroupId();
		imagens = BibliotecaImagensUtil.getTodasImagensDaBiblioteca(groupId);

	}

	/**
	 * Carrega os dados do banner que estão cadastrados para esta configuracao
	 * 
	 * @param config
	 */
	public void carregarDadosBanner() {

		Configuracao config = configuracaoAdminBean.getConfig();
		if (config.getImagemIdBanner() != 0) {
			try {
				imagemSelecionada = BibliotecaImagensUtil
						.getFileEntryDisplay(config.getImagemIdBanner());
			} catch (PortalException e) {
				imagemSelecionada = BibliotecaImagensUtil
						.getImagemPadraoBanner();
			}

		}

		tituloBanner = config.getTituloBanner();
		textoBanner = config.getTextoBanner();
		urlExterna = Boolean.valueOf(config.getUrlExterna());

		// Carregando dados do link externo
		if (urlExterna) {
			linkExterno = config.getUrlBanner();
			linkComunidade = "";
		} else {
			linkComunidade = config.getUrlBanner();
			linkExterno = "";
		}

	}

	public void salvarBanner() {
		if (validarDados()) {
			if (configuracaoAdminBean.getConfig().getConfiguracaoId() != 0) {
				Configuracao configuracaoAtual = configuracaoAdminBean
						.getConfig();
				configuracaoAtual.setImagemIdBanner(imagemSelecionada
						.getFileEntryId());
				configuracaoAtual.setTextoBanner(textoBanner);
				configuracaoAtual.setTituloBanner(tituloBanner);
				configuracaoAtual.setUrlExterna(urlExterna);

				// Tratamento de qual url salvar
				if (urlExterna) {
					configuracaoAtual.setUrlBanner(linkExterno);
				} else {
					configuracaoAtual.setUrlBanner(linkComunidade);
				}

				try {
					ConfiguracaoLocalServiceUtil.updateConfiguracao(
							configuracaoAdminBean.getConfig(), true);
				} catch (SystemException e) {
					throw new RuntimeException(e);
				}

			}
		}
		configuracaoAdminBean.atualizaConfiguracao();
	}

	/**
	 * Valida os dados obrigatórios do banner
	 * 
	 * @return
	 */
	private boolean validarDados() {

		Locale locale = LiferayFacesContext.getInstance().getLocale();
		PortletConfig config = LiferayFacesContext.getInstance()
				.getPortletConfig();
		boolean dadosOk = true;

		if (StringUtils.isBlank(tituloBanner)) {
			LiferayFacesContext.getInstance().addGlobalErrorMessage(
					LanguageUtil.get(config, locale,
							"titulo-banner-obrigatorio"));
			dadosOk = false;
		}

		if (StringUtils.isBlank(textoBanner)) {
			LiferayFacesContext.getInstance().addGlobalErrorMessage(
					LanguageUtil.get(config, locale,
							"descricao-banner-obrigatorio"));
			dadosOk = false;
		}

		if (urlExterna) {
			if (StringUtils.isBlank(linkExterno)) {
				LiferayFacesContext.getInstance().addGlobalErrorMessage(
						"digite-url-externa");
				dadosOk = false;
			}
		}

		return dadosOk;
	}

	public List<FileEntryDisplay> getImagens() {
		return imagens;
	}

	public FileEntryDisplay getImagemSelecionada() {
		return imagemSelecionada;
	}

	public void setImagemSelecionada(FileEntryDisplay imagemSelecionada) {
		this.imagemSelecionada = imagemSelecionada;
	}

	public Boolean getUrlExterna() {
		return urlExterna;
	}

	public void setUrlExterna(Boolean urlExterna) {
		this.urlExterna = urlExterna;
	}

	public String getLinkExterno() {
		return linkExterno;
	}

	public void setLinkExterno(String linkExterno) {
		this.linkExterno = linkExterno;
	}

	public String getLinkComunidade() {
		return linkComunidade;
	}

	public void setLinkComunidade(String linkComunidade) {
		this.linkComunidade = linkComunidade;
	}

	public String getTituloBanner() {
		return tituloBanner;
	}

	public void setTituloBanner(String tituloBanner) {
		this.tituloBanner = tituloBanner;
	}

	public String getTextoBanner() {
		return textoBanner;
	}

	public void setTextoBanner(String textoBanner) {
		this.textoBanner = textoBanner;
	}

	public ConfiguracaoAdminBean getConfiguracaoAdminBean() {
		return configuracaoAdminBean;
	}

	public void setConfiguracaoAdminBean(
			ConfiguracaoAdminBean configuracaoAdminBean) {
		this.configuracaoAdminBean = configuracaoAdminBean;
	}
}
