package org.jboss.windup.reporting.service;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.jboss.windup.config.GraphRewrite;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.service.GraphService;
import org.jboss.windup.reporting.model.TagSetModel;

import com.tinkerpop.blueprints.Vertex;

/**
 * Contains methods for getting tag set models as well as maintaining a cache.
 *
 * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
 */
public class TagSetService extends GraphService<TagSetModel>
{
    private static final String TAG_CACHE_KEY = TagSetService.class.getCanonicalName() + "_Cache";

    public TagSetService(GraphContext context)
    {
        super(context, TagSetModel.class);
    }

    private Map<Set<String>, Vertex> getCache(GraphRewrite event)
    {
        @SuppressWarnings("unchecked")
        Map<Set<String>, Vertex> result = (Map<Set<String>, Vertex>) event.getRewriteContext().get(TAG_CACHE_KEY);
        if (result == null)
        {
            result = new HashMap<>();
            event.getRewriteContext().put(TAG_CACHE_KEY, result);
        }
        return result;
    }

    /**
     * This essentially ensures that we only store a single Vertex for each unique "Set" of tags.
     */
    public TagSetModel getOrCreate(GraphRewrite event, Set<String> tags)
    {
        Map<Set<String>, Vertex> cache = getCache(event);
        Vertex vertex = cache.get(tags);
        if (vertex == null)
        {
            TagSetModel model = create();
            model.setTags(tags);
            cache.put(tags, model.asVertex());
            return model;
        }
        else
        {
            return frame(vertex);
        }
    }
}
