package org.jboss.windup.rules.apps.java.condition;

import org.jboss.windup.config.GraphRewrite;
import org.jboss.windup.config.condition.GraphCondition;
import org.jboss.windup.rules.apps.java.config.SourceModeOption;
import org.ocpsoft.rewrite.config.ConditionBuilder;
import org.ocpsoft.rewrite.context.EvaluationContext;

/**
 * Condition that returns <code>true</code> if {@link SourceModeOption} is set to <code>true</code>.
 * 
 * @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
 */
public class SourceMode extends GraphCondition
{
    /**
     * Create a new {@link SourceMode} condition that returns <code>true</code> if {@link SourceModeOption} is enabled.
     */
    public static ConditionBuilder isEnabled()
    {
        return new SourceMode(Boolean.TRUE);
    }

    /**
     * Create a new {@link SourceMode} condition that returns <code>true</code> if {@link SourceModeOption} is NOT
     * enabled.
     */
    public static ConditionBuilder isDisabled()
    {
        return new SourceMode(Boolean.FALSE);
    }

    private final Boolean value;

    private SourceMode(Boolean value)
    {
        this.value = value;
    }

    @Override
    public boolean evaluate(GraphRewrite event, EvaluationContext context)
    {
        Boolean result = (Boolean) event.getGraphContext().getOptionMap().get(SourceModeOption.NAME);
        if (value)
        {
            return value.equals(result);
        }
        else
        {
            return value.equals(result) || result == null;
        }
    }

}
