package org.bndtools.core.resolve.ui;

import java.util.Map.Entry;

import org.bndtools.core.ui.resource.R5LabelFormatter;
import org.bndtools.utils.jface.ImageCachingLabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.graphics.Image;
import org.osgi.resource.Namespace;
import org.osgi.resource.Requirement;
import org.osgi.resource.Resource;

import bndtools.Plugin;

public class ResolutionTreeLabelProvider extends ImageCachingLabelProvider {

    private final boolean shortenNamespaces;

    public ResolutionTreeLabelProvider() {
        this(false);
    }

    public ResolutionTreeLabelProvider(boolean shortenNamespaces) {
        super(Plugin.PLUGIN_ID);
        this.shortenNamespaces = shortenNamespaces;
    }

    @Override
    public void update(ViewerCell cell) {
        Object element = cell.getElement();

        StyledString label = new StyledString();
        Image icon = null;

        if (element instanceof ResolutionTreeItem) {
            ResolutionTreeItem item = (ResolutionTreeItem) element;
            R5LabelFormatter.appendCapability(label, item.getCapability(), shortenNamespaces);

            // Get the icon from the capability namespace
            icon = getImage(R5LabelFormatter.getNamespaceImagePath(item.getCapability()
                .getNamespace()), true);
        } else if (element instanceof Requirement) {
            Requirement requirement = (Requirement) element;
            if (Namespace.RESOLUTION_OPTIONAL.equals(requirement.getDirectives()
                .get(Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE)))
                label.append(" OPTIONALLY", StyledString.QUALIFIER_STYLER);
            label.append(" REQUIRED BY ", StyledString.QUALIFIER_STYLER);

            Resource resource = requirement.getResource();
            if (resource != null)
                R5LabelFormatter.appendResourceLabel(label, resource);
            else
                label.append(" INITIAL");

            label.append(" [", StyledString.QUALIFIER_STYLER);
            boolean first = true;
            for (Entry<String, String> entry : requirement.getDirectives()
                .entrySet()) {
                String key = entry.getKey();
                if (!key.equals(Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE)) {
                    if (!first)
                        label.append(",", StyledString.QUALIFIER_STYLER);
                    first = false;
                    label.append(key + ":=" + entry.getValue(), StyledString.QUALIFIER_STYLER);
                }
            }
            label.append("]", StyledString.QUALIFIER_STYLER);
        }

        cell.setText(label.getString());
        cell.setStyleRanges(label.getStyleRanges());
        cell.setImage(icon);
    }
}
