/*
 * Copyright 2014 Red Hat, Inc. and/or its affiliates.
 *
 * Licensed under the Eclipse Public License version 1.0, available at
 * http://www.eclipse.org/legal/epl-v10.html
 */
package org.jboss.windup.config;

import java.util.LinkedList;
import java.util.List;

import org.jboss.windup.config.loader.RuleLoaderContext;
import org.jboss.windup.config.metadata.MetadataBuilder;
import org.jboss.windup.config.model.TestXmlMetaFacetModel;
import org.jboss.windup.config.operation.GraphOperation;
import org.jboss.windup.config.operation.Iteration;
import org.jboss.windup.config.operation.graph.TypeOperation;
import org.jboss.windup.config.phase.DiscoveryPhase;
import org.jboss.windup.config.query.Query;
import org.jboss.windup.rules.apps.java.model.project.MavenProjectModel;
import org.ocpsoft.rewrite.config.Configuration;
import org.ocpsoft.rewrite.config.ConfigurationBuilder;
import org.ocpsoft.rewrite.context.EvaluationContext;

/**
 * @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
 * 
 */
public class TestMavenExampleRuleProvider extends AbstractRuleProvider
{
    private final List<MavenProjectModel> results = new LinkedList<>();

    public TestMavenExampleRuleProvider()
    {
        super(MetadataBuilder.forProvider(TestMavenExampleRuleProvider.class, "TestMavenExampleRuleProvider")
                    .setPhase(DiscoveryPhase.class));
    }

    // @formatter:off
    @Override
    public Configuration getConfiguration(RuleLoaderContext ruleLoaderContext)
    {
        Configuration configuration = ConfigurationBuilder.begin()

        // Add the MavenFacetModel type to all XmlMetaFacetModel vertices.
        .addRule()
        .when(
            Query.fromType(TestXmlMetaFacetModel.class)
        )
        .perform(
            Iteration.over(TestXmlMetaFacetModel.class)
            .perform(
                TypeOperation.addType(Iteration.DEFAULT_SINGLE_VARIABLE_STRING, MavenProjectModel.class)
            )
            .endIteration()
        )

        // Add all MavenFacetModel vertices to this.results.
        .addRule()
        .when(
            Query.fromType(MavenProjectModel.class).as("mavenModels")
        )
        .perform(
            Iteration.over(MavenProjectModel.class, "mavenModels")
                .perform( new GraphOperation()
                {
                    @Override
                    public void perform(GraphRewrite event, EvaluationContext context)
                    {
                        Variables varStack = Variables.instance(event);
                        MavenProjectModel mavenFacetModel = 
                            Iteration.getCurrentPayload(varStack, MavenProjectModel.class, Iteration.singleVariableIterationName("mavenModels"));
                        results.add(mavenFacetModel);
                    }
                })
                .endIteration()
        );
        return configuration;
    }
    // @formatter:on

    public List<MavenProjectModel> getSearchResults()
    {
        return results;
    }
}
