/*
 * 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.jsf.impl.listener.phase;

import org.apache.myfaces.extensions.cdi.jsf.api.listener.phase.JsfPhaseId;
import org.apache.myfaces.extensions.cdi.jsf.api.listener.phase.JsfLifecyclePhaseInformation;
import org.apache.myfaces.extensions.cdi.jsf.api.listener.phase.AfterPhase;
import org.apache.myfaces.extensions.cdi.jsf.api.listener.phase.BeforePhase;

import javax.enterprise.context.RequestScoped;
import javax.enterprise.event.Event;
import javax.faces.event.PhaseEvent;
import javax.inject.Inject;
import javax.inject.Named;
import java.lang.annotation.Annotation;

/**
 * {@inheritDoc}
 */

@RequestScoped
@Named
public class JsfRequestLifecycleBroadcaster implements JsfLifecyclePhaseInformation
{
    private javax.faces.event.PhaseId facesPhaseId;

    @Inject
    private Event<PhaseEvent> phaseEvent;

    @Inject
    @BeforePhase(JsfPhaseId.ANY_PHASE)
    private Event<PhaseEvent> beforeAnyPhaseEvent;

    @Inject
    @AfterPhase(JsfPhaseId.ANY_PHASE)
    private Event<PhaseEvent> afterAnyPhaseEvent;

    public void broadcastBeforeEvent(PhaseEvent phaseEvent)
    {
        this.facesPhaseId = phaseEvent.getPhaseId();

        this.phaseEvent.select(createAnnotationLiteral(phaseEvent.getPhaseId(), true)).fire(phaseEvent);
        this.beforeAnyPhaseEvent.fire(phaseEvent);
    }

    public void broadcastAfterEvent(PhaseEvent phaseEvent)
    {
        this.phaseEvent.select(createAnnotationLiteral(phaseEvent.getPhaseId(), false)).fire(phaseEvent);
        this.afterAnyPhaseEvent.fire(phaseEvent);
    }

    private Annotation createAnnotationLiteral(javax.faces.event.PhaseId phaseId, boolean isBeforeEvent)
    {
        if (isBeforeEvent)
        {
            return createBeforeLiteral(phaseId);
        }
        return createAfterLiteral(phaseId);
    }

    private Annotation createBeforeLiteral(final javax.faces.event.PhaseId phaseId)
    {
        return new BeforePhaseBinding()
        {
            private static final long serialVersionUID = 849645435335842723L;

            /**
             * {@inheritDoc}
             */
            public JsfPhaseId value()
            {
                return JsfPhaseId.convertFromFacesClass(phaseId);
            }
        };
    }

    private Annotation createAfterLiteral(final javax.faces.event.PhaseId phaseId)
    {
        return new AfterPhaseBinding()
        {
            private static final long serialVersionUID = 490037768660184656L;

            /**
             * {@inheritDoc}
             */
            public JsfPhaseId value()
            {
                return JsfPhaseId.convertFromFacesClass(phaseId);
            }
        };
    }

    /*
     * implementation of JsfLifecyclePhaseInformation methods
     */

    /**
     * {@inheritDoc}
     */
    public boolean isRestoreViewPhase()
    {
        return javax.faces.event.PhaseId.RESTORE_VIEW.equals(this.facesPhaseId);
    }

    /**
     * {@inheritDoc}
     */
    public boolean isApplyRequestValuesPhase()
    {
        return javax.faces.event.PhaseId.APPLY_REQUEST_VALUES.equals(this.facesPhaseId);
    }

    /**
     * {@inheritDoc}
     */
    public boolean isProcessValidationsPhase()
    {
        return javax.faces.event.PhaseId.PROCESS_VALIDATIONS.equals(this.facesPhaseId);
    }

    /**
     * {@inheritDoc}
     */
    public boolean isUpdateModelValuesPhase()
    {
        return javax.faces.event.PhaseId.UPDATE_MODEL_VALUES.equals(this.facesPhaseId);
    }

    /**
     * {@inheritDoc}
     */
    public boolean isInvokeApplicationPhase()
    {
        return javax.faces.event.PhaseId.INVOKE_APPLICATION.equals(this.facesPhaseId);
    }

    /**
     * {@inheritDoc}
     */
    public boolean isRenderResponsePhase()
    {
        return javax.faces.event.PhaseId.RENDER_RESPONSE.equals(this.facesPhaseId);
    }
}
