package org.eclipse.platform.discovery.compatibility.internal.contributors.impl;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.IContributor;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.platform.discovery.compatibility.internal.contributors.ContributionFailedException;
import org.eclipse.platform.discovery.compatibility.internal.contributors.IDynamicRegistryContributor;
import org.eclipse.platform.discovery.compatibility.internal.contributors.impl.results.CompatCustomResultsUiCreator;
import org.eclipse.platform.discovery.runtime.internal.model.descriptions.ISearchProviderDescription;
import org.eclipse.platform.discovery.runtime.internal.xp.IContributionsReader;
import org.eclipse.platform.discovery.ui.internal.xp.impl.CustomResultUiXpParser;
import org.w3c.dom.Element;

public class DynamicCustomResultUiContributor extends BasicRegistryContributor implements IDynamicRegistryContributor{

	private final IContributionsReader<ISearchProviderDescription> parser;
	private final IdCalculator idCalculator;

	public DynamicCustomResultUiContributor(IContributionsReader<ISearchProviderDescription> providersParser) {
		this.parser = providersParser;
		this.idCalculator = new IdCalculator();
	}
	
	
	@Override
	public void contribute(IExtensionRegistry registry, IContributor contributor, Object token) throws ContributionFailedException {
		List<String> failed = new ArrayList<String>();
		
		for(ISearchProviderDescription providerDescription: parser.readContributions()) {
			if(idCalculator.isCompatibilitySearchProvider(providerDescription)) {
				String compatProviderId = providerDescription.getId();
				Element pluginElement = createPluginSnippet(CustomResultUiXpParser.XP_ID);
				
				Element contributorElement = pluginElement.getOwnerDocument().createElement(CustomResultUiXpParser.XP_ELEMENT_NAME);
				contributorElement.setAttribute(CustomResultUiXpParser.ID_ATTR_NAME, idCalculator.calculateSearchResultUiId(idCalculator.calculateSearchPageId(compatProviderId)));
				contributorElement.setAttribute(CustomResultUiXpParser.SEARCH_PROVIDER_ID_ATTR_NAME, compatProviderId);
				contributorElement.setAttribute(CustomResultUiXpParser.UI_CREATOR_CLASS_NAME_ATTR_NAME, CompatCustomResultsUiCreator.class.getName());
				
				addElementToPluginSnippet(pluginElement, contributorElement);
				String description = "result Ui contribution for search provider"+compatProviderId;
				if(!writeToRegistry(pluginElement, registry, contributor, token, description)) {
					failed.add(description);
				}

			}
			
		}
		
		if(!failed.isEmpty()) {
			throw new ContributionFailedException(failed.toString());
		}
	}
	
}
