/*******************************************************************************
 * Copyright (c) 2004, 2009 Eugene Kuleshov and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Eugene Kuleshov - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.internal.sandbox.ui;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Assert;
import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
import org.eclipse.mylyn.tasks.core.IRepositoryManager;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.ui.AbstractTaskRepositoryLinkProvider;
import org.eclipse.pde.core.IModel;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.PluginRegistry;
import org.eclipse.pde.internal.core.PDECore;
import org.eclipse.pde.internal.core.ifeature.IFeatureModel;
import org.eclipse.pde.internal.core.natures.PDE;

/**
 * Task repository link provider for Eclipse.org PDE projects
 * 
 * @author Eugene Kuleshov
 */
// TODO could use extension point to declare mapping for 3rd party plugin providers
public class EclipseTaskRepositoryLinkProvider extends AbstractTaskRepositoryLinkProvider {

	@Override
	public TaskRepository getTaskRepository(IResource resource, IRepositoryManager repositoryManager) {
		IProject project = resource.getProject();
		if (project == null || !project.isAccessible()) {
			return null;
		}

		if (PDE.hasPluginNature(project)) {
			IPluginModelBase pluginModel = PluginRegistry.findModel(project);
			if (pluginModel != null) {
				String providerName = pluginModel.getPluginBase().getProviderName();
				if (providerName != null) {
					return getTaskRepository(providerName, pluginModel, repositoryManager);
				}
			}
		} else if (PDE.hasFeatureNature(project)) {
			IFeatureModel featureModel = PDECore.getDefault().getFeatureModelManager().getFeatureModel(project);
			if (featureModel != null) {
				String providerName = featureModel.getFeature().getProviderName();
				if (providerName != null) {
					return getTaskRepository(providerName, featureModel, repositoryManager);
				}
			}
		} else if (PDE.hasUpdateSiteNature(project)) {
			// TODO could use referenced features to lookup task repository
		}

		return null;
	}

	private TaskRepository getTaskRepository(String providerName, IModel model, IRepositoryManager repositoryManager) {
		Assert.isNotNull(providerName);
		Assert.isNotNull(model);
		Assert.isNotNull(repositoryManager);
		if (providerName.startsWith("%")) {
			providerName = model.getResourceString(providerName);
		}
		if ("Eclipse.org".equals(providerName)) {
			return repositoryManager.getRepository(BugzillaCorePlugin.CONNECTOR_KIND, "https://bugs.eclipse.org/bugs");
		}
		return null;
	}

}
