/*
 * 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.validator.test.core.stage;

import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.myfaces.extensions.validator.core.*;
import org.apache.myfaces.extensions.validator.test.core.AbstractExValCoreTestCase;

import javax.faces.context.FacesContext;

public class IndependentProjectStageTestCase extends AbstractExValCoreTestCase
{
    private static final String INDEPENDENT_PROJECT_STAGE = "custom.PROJECT_STAGE";
    private static final String JSF_PROJECT_STAGE = "javax.faces.PROJECT_STAGE";

    private static final String CUSTOM_DEV = "custom_dev";
    private static final String CUSTOM_PROD = "custom_prod";
    private static final String CUSTOM_TEST = "custom_test";

    public IndependentProjectStageTestCase(String name)
    {
        super(name);
    }

    public static Test suite()
    {
        return new TestSuite(IndependentProjectStageTestCase.class);
    }

    
    @Override
    protected ExtValCoreConfiguration getCustomExtValCoreConfiguration()
    {
        return new DefaultExtValCoreConfiguration()
        {
            @Override
            public ProjectStageResolver projectStageResolver()
            {
                return new DefaultProjectStageResolver()
                {
                    @Override
                    public ProjectStage getCurrentProjectStage()
                    {
                        String jsfProjectStageName = resolveProjectStageName("javax.faces.PROJECT_STAGE");
                        String independentProjectStageName = resolveProjectStageName(INDEPENDENT_PROJECT_STAGE);

                        if (!(jsfProjectStageName == null || "".equals(jsfProjectStageName)))
                        {
                            ProjectStageName result = ProjectStage.createStageName(jsfProjectStageName.trim());
                            for (JsfProjectStage jsfProjectStage : JsfProjectStage.values())
                            {
                                if (jsfProjectStage.getValue().equals(result))
                                {
                                    return ProjectStage.createStage(result);
                                }
                            }
                        }

                        if (!(independentProjectStageName == null || "".equals(independentProjectStageName)))
                        {
                            ProjectStageName independentResult = ProjectStage
                                    .createStageName(independentProjectStageName.trim());

                            //check jsf stage values first
                            ProjectStageName result = ProjectStage.createStageName(independentProjectStageName.trim());
                            for (JsfProjectStage jsfProjectStage : JsfProjectStage.values())
                            {
                                if (jsfProjectStage.getValue().equals(result))
                                {
                                    return ProjectStage.createStage(result);
                                }
                            }

                            //check custom stage values
                            if (ProjectStage.createStageName(CUSTOM_DEV).equals(independentResult)
                                    || ProjectStage.createStageName(CUSTOM_TEST).equals(independentResult))
                            {
                                return ProjectStage.createStage(independentResult);
                            }
                        }

                        return createProjectStage(ProjectStage.createStageName(CUSTOM_PROD));
                    }
                };
            }
        };
    }

    private String resolveProjectStageName(String parameterName)
    {
        try
        {
            return FacesContext.getCurrentInstance()
                    .getExternalContext().getInitParameter(parameterName);
        }
        catch (Exception e)
        {
            return null;
        }
    }

    public void testDevelopmentStage()
    {
        servletContext.addInitParameter(INDEPENDENT_PROJECT_STAGE, CUSTOM_DEV);
        assertTrue(ProjectStage.is(ProjectStage.createStageName(CUSTOM_DEV)));
    }

    public void testTestStage()
    {
        servletContext.addInitParameter(INDEPENDENT_PROJECT_STAGE, CUSTOM_TEST);
        assertTrue(ProjectStage.is(ProjectStage.createStageName(CUSTOM_TEST)));
    }

    public void testFallbackStage()
    {
        servletContext.addInitParameter(INDEPENDENT_PROJECT_STAGE, "SystemTest");
        assertTrue(JsfProjectStage.is(JsfProjectStage.SystemTest));
        assertTrue(ProjectStage.is(ProjectStage.createStageName("SystemTest")));
        assertTrue(ProjectStage.is(JsfProjectStage.SystemTest.getValue()));
    }

    public void testOverrideJsfStage()
    {
        servletContext.addInitParameter(INDEPENDENT_PROJECT_STAGE, CUSTOM_DEV);
        servletContext.addInitParameter(JSF_PROJECT_STAGE, "SystemTest");

        assertTrue(JsfProjectStage.is(JsfProjectStage.SystemTest));
        assertTrue(ProjectStage.is(JsfProjectStage.SystemTest.getValue()));
    }

    public void testProductionStage()
    {
        servletContext.addInitParameter(INDEPENDENT_PROJECT_STAGE, CUSTOM_PROD);
        assertTrue(ProjectStage.is(ProjectStage.createStageName(CUSTOM_PROD)));
    }

    public void testDefaultStage()
    {
        assertTrue(ProjectStage.is(ProjectStage.createStageName(CUSTOM_PROD)));
    }

    public void testWrongDefaultStage1()
    {
        assertFalse(ProjectStage.is(ProjectStage.createStageName(CUSTOM_DEV)));
    }

    public void testWrongDefaultStage2()
    {
        assertFalse(ProjectStage.is(ProjectStage.createStageName(CUSTOM_TEST)));
    }
}
