/*******************************************************************************
 * Copyright (c) 2009 by SAP AG, Walldorf. 
 * 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:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.ws.jaxws.utils.facets;

import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jst.ws.jaxws.utils.ContractChecker;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.IProjectFacet;
import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;


public class FacetUtils implements IFacetUtils
{
	/**
	 * @throws NullPointerException
	 *             if <c>project</c> or <c>facetIds</c> is null
	 */
	public boolean hasAnyFacet(IProject project, String... facetIds) throws CoreException
	{
		ContractChecker.nullCheckParam(project);
		ContractChecker.nullCheckParam(facetIds);

		if (!isFacetedProject(project))
		{
			return false;
		}

		final IFacetedProject facetedProject = getFacetedProject(project);
		for (String facetId : facetIds)
		{
			final IProjectFacet facet = ProjectFacetsManager.getProjectFacet(facetId);
			if (facetedProject.hasProjectFacet(facet))
			{
				return true;
			}
		}
		return false;
	}

	public boolean hasFacetWithVersion(IProject project, String facetVersion, String facetId) throws CoreException
	{
		return hasFacetWithVersion(project, facetVersion, facetId, true);
	}

	public boolean isFacetedProject(IProject project) throws CoreException
	{
		Set<IFacetedProject> facetedProjects = getAllWorkspaceFacetedProjects();
		final Iterator<IFacetedProject> i = facetedProjects.iterator();
		while (i.hasNext())
		{
			final IFacetedProject fp = (IFacetedProject) i.next();
			if (project.equals(fp.getProject()))
			{
				return true;
			}
		}
		return false;
	}

	public boolean hasFacetWithVersion(IProject project, String facetVersion, String facetId, boolean acceptHigherFacetVersion) throws CoreException
	{
		ContractChecker.nullCheckParam(project);
		ContractChecker.nullCheckParam(facetVersion);
		ContractChecker.nullCheckParam(facetId);

		if (!isFacetedProject(project))
		{
			return false;
		}

		Set<IProjectFacetVersion> allFacetsVersions = getProjectFacets(project);
		for (IProjectFacetVersion ver : allFacetsVersions)
		{
			if (ver.getProjectFacet().getId().equals(facetId))
			{
				return isFacetAcceptable(ver, facetVersion, acceptHigherFacetVersion);
			}
		}

		return false;
	}

	private boolean isFacetAcceptable(IProjectFacetVersion facetVersion, String facetVersionId, boolean acceptHigherFacetVersion)
									throws CoreException
	{
		assert facetVersion != null;

		// Check for exact version
		if (!acceptHigherFacetVersion)
		{
			return facetVersion.getVersionString().equals(facetVersionId);
		}

		Comparator<String> comparator = facetVersion.getProjectFacet().getVersionComparator();
		String currentFacetVersion = facetVersion.getVersionString();
		return comparator.compare(currentFacetVersion, facetVersionId) >= 0;
	}

	private IFacetedProject getFacetedProject(IProject project) throws CoreException
	{
		return ProjectFacetsManager.create(project);
	}

	private Set<IProjectFacetVersion> getProjectFacets(IProject project) throws CoreException
	{
		assert isFacetedProject(project);

		return getFacetedProject(project).getProjectFacets();
	}

	private Set<IFacetedProject> getAllWorkspaceFacetedProjects() throws CoreException
	{
		return ProjectFacetsManager.getFacetedProjects();
	}

}
