package org.exoplatform.platform.common.account.setup.web;

import org.exoplatform.commons.api.settings.SettingService;
import org.exoplatform.commons.api.settings.SettingValue;
import org.exoplatform.commons.api.settings.data.Context;
import org.exoplatform.commons.api.settings.data.Scope;
import org.exoplatform.commons.utils.PropertyManager;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.web.filter.Filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author <a href="fbradai@exoplatform.com">Fbradai</a>
 */
public class AccountSetupFilter implements Filter {
    private static final String PLF_PLATFORM_EXTENSION_SERVLET_CTX = "/platform-extension";
    private static final String ACCOUNT_SETUP_SERVLET = "/accountSetup";
    private static final String ACCOUNT_SETUP_SKIP_PROPERTY = "accountsetup.skip";

    private static final Log LOG = ExoLogger.getLogger(AccountSetupFilter.class);
    SettingService settingService ;
    private static String REST_URI;
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest)request;
        HttpServletResponse httpServletResponse = (HttpServletResponse)response;
        REST_URI = ExoContainerContext.getCurrentContainer().getContext().getRestContextName();
        boolean isDevMod = PropertyManager.isDevelopping();
        Boolean isSetupSkip =  AccountSetup.SETUP_SKIP;
        String propertySetupSkip =  PropertyManager.getProperty(ACCOUNT_SETUP_SKIP_PROPERTY);
        if(propertySetupSkip == null){
            LOG.debug("Property accountsetup.skip not found in configuration.properties ");
            propertySetupSkip = "false";
        }
        settingService = (SettingService) PortalContainer.getInstance().getComponentInstanceOfType(SettingService.class);
        
        boolean setupDone = false;
        SettingValue accountSetupNode = settingService.get(Context.GLOBAL, Scope.GLOBAL, AccountSetup.ACCOUNT_SETUP_NODE);
        if(accountSetupNode != null) {
            setupDone = true;
        } else if (isSetupSkip || propertySetupSkip.equals("true")) {
            settingService.set(Context.GLOBAL, Scope.GLOBAL, AccountSetup.ACCOUNT_SETUP_NODE, SettingValue.create("setup over:" + "true"));
            setupDone = true;
        }
        String requestUri = httpServletRequest.getRequestURI();
        boolean isRestUri = (requestUri.contains(REST_URI));
        if((!setupDone)&&(!isDevMod)&&(!isRestUri)) {
        	
            ServletContext platformExtensionContext = httpServletRequest.getSession().getServletContext().getContext(PLF_PLATFORM_EXTENSION_SERVLET_CTX);
            platformExtensionContext.getRequestDispatcher(ACCOUNT_SETUP_SERVLET).forward(httpServletRequest, httpServletResponse);
            return;
        }
        chain.doFilter(request, response);
    }
}
