package org.bndtools.core.ui.resource;

import org.bndtools.utils.resources.ResourceUtils;
import org.eclipse.jface.viewers.StyledString;
import org.osgi.framework.Version;
import org.osgi.resource.Capability;
import org.osgi.resource.Namespace;
import org.osgi.resource.Requirement;
import org.osgi.resource.Resource;

public class RequirementWithResourceLabelProvider extends RequirementLabelProvider {

    @Override
    public StyledString getLabel(Requirement requirement) {

        StyledString label = new StyledString();

        Resource resource = requirement.getResource();
        if (!(resource == null || resource.getCapabilities("osgi.content")
            .isEmpty()))
            appendResourceLabel(label, resource);

        if (Namespace.RESOLUTION_OPTIONAL.equals(requirement.getDirectives()
            .get(Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE)))
            label.append(" optionally", StyledString.QUALIFIER_STYLER);
        label.append(" requires ", StyledString.QUALIFIER_STYLER);

        super.getLabel(label, requirement);

        return label;
    }

    protected void appendResourceLabel(StyledString label, Resource resource) {
        Capability identity = ResourceUtils.getIdentityCapability(resource);
        String name = ResourceUtils.getIdentity(identity);
        if (name == null) {
            if (resource != null) {
                name = resource.toString();
            } else {
                name = "<unknown>";
            }
        }
        label.append(name);

        Version version = ResourceUtils.getVersion(identity);
        if (version != null)
            label.append(" " + version, StyledString.COUNTER_STYLER);
    }

}
