package org.jboss.windup.reporting.rules.rendering;

import javax.enterprise.inject.Vetoed;
import javax.inject.Inject;

import org.jboss.forge.furnace.services.Imported;
import org.jboss.windup.config.AbstractRuleProvider;
import org.jboss.windup.config.GraphRewrite;
import org.jboss.windup.config.loader.RuleLoaderContext;
import org.jboss.windup.config.metadata.RuleMetadata;
import org.jboss.windup.config.operation.GraphOperation;
import org.jboss.windup.config.phase.PostReportRenderingPhase;
import org.jboss.windup.reporting.renderer.GraphRenderer;
import org.ocpsoft.rewrite.config.Configuration;
import org.ocpsoft.rewrite.config.ConfigurationBuilder;
import org.ocpsoft.rewrite.context.EvaluationContext;

/**
 * This renders the graph itself to the output directory for debug purposes.
 *
 * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
 */
@Vetoed
@RuleMetadata(phase = PostReportRenderingPhase.class)
public class RenderGraphRuleProvider extends AbstractRuleProvider {
    @Inject
    private Imported<GraphRenderer> renderers;

    @Override
    public Configuration getConfiguration(final RuleLoaderContext ruleLoaderContext) {
        return ConfigurationBuilder.begin()
                .addRule()
                .perform(new GraphOperation() {
                    @Override
                    public void perform(GraphRewrite event, EvaluationContext context) {
                        for (GraphRenderer renderer : renderers) {
                            renderer.renderGraph(event.getGraphContext());
                        }
                    }

                    @Override
                    public String toString() {
                        return "RenderGraphForDebugging";
                    }
                });
    }
}
