/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.myfaces.extensions.cdi.javaee.jsf.impl.listener.phase;

import org.apache.myfaces.extensions.cdi.core.api.listener.phase.View;
import org.apache.myfaces.extensions.cdi.javaee.jsf.api.listener.phase.BeforePhase;
import org.apache.myfaces.extensions.cdi.javaee.jsf.api.listener.phase.AfterPhase;

import javax.interceptor.Interceptor;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
import javax.faces.context.FacesContext;
import java.lang.annotation.Annotation;

/**
 * @author Gerhard Petracek
 */

@View
@Interceptor
public class ViewControllerInterceptor
{
    @AroundInvoke
    public Object filterPhaseListenerMethods(InvocationContext invocationContext) throws Exception
    {
        Object result = null;
        try
        {
            if(invokeListenerMethod(invocationContext))
            {
                result = invocationContext.proceed();
            }
        }
        catch (Exception e)
        {
            throw e;
        }

        return result;
    }

    private boolean invokeListenerMethod(InvocationContext invocationContext)
    {
        if(!isObserverMethod(invocationContext) || !isViewAnnotationPresent(invocationContext))
        {
            return true;
        }

        View view = getViewAnnotation(invocationContext);

        if(view.value().length == 1 && "*".equals(view.value()[0]))
        {
            return true;
        }

        String viewId = FacesContext.getCurrentInstance().getViewRoot().getViewId();
        return isMethodBoundToView(view.value(), viewId);
    }

    private boolean isObserverMethod(InvocationContext invocationContext)
    {
        for(Annotation[] annotations : invocationContext.getMethod().getParameterAnnotations())
        {
            for(Annotation annotation : annotations)
            {
                if(BeforePhase.class.isAssignableFrom(annotation.annotationType()) ||
                        AfterPhase.class.isAssignableFrom(annotation.annotationType()))
                {
                    return true;
                }
            }
        }
        return false;
    }

    private boolean isViewAnnotationPresent(InvocationContext invocationContext)
    {
        return invocationContext.getMethod().isAnnotationPresent(View.class) ||
             invocationContext.getMethod().getDeclaringClass().isAnnotationPresent(View.class);
    }

    private View getViewAnnotation(InvocationContext invocationContext)
    {
        View view;
        if(invocationContext.getMethod().isAnnotationPresent(View.class))
        {
            view = invocationContext.getMethod().getAnnotation(View.class);
        }
        else
        {
            view = invocationContext.getMethod().getDeclaringClass().getAnnotation(View.class);
        }
        return view;
    }

    private boolean isMethodBoundToView(String[] viewIds, String viewId)
    {
        for(String current : viewIds)
        {
            if(current.equals(viewId))
            {
                return true;
            }
        }
        return false;
    }
}
