/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ui.internal.intro.universal.contentdetect;

import java.util.HashSet;
import java.util.Set;

import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.Platform;
import org.eclipse.ui.intro.IntroContentDetector;

public class ContentDetector extends IntroContentDetector {

	private static Set<String> newContributors;
	private static boolean detectorCalled = false;

	public ContentDetector() {
	}

	@Override
	public boolean isNewContentAvailable() {
		try {
			detectorCalled = true;
			// If we have previously found new content no need to recompute
			if (newContributors != null && !newContributors.isEmpty()) {
				return true;
			}
			IExtension[] extensions = Platform
					.getExtensionRegistry()
					.getExtensionPoint("org.eclipse.ui.intro.configExtension").getExtensions(); //$NON-NLS-1$
			int numIntroExtensions = extensions.length;

			ContentDetectHelper helper = new ContentDetectHelper();
			int previous = helper.getExtensionCount();
			if (numIntroExtensions != previous) {
				helper.saveExtensionCount(numIntroExtensions);
				Set<String> contributors = new HashSet<>();
				for (int i = 0; i < extensions.length; i++) {
					contributors.add(extensions[i].getContributor().getName());
				}
				if (numIntroExtensions > previous && previous != ContentDetectHelper.NO_STATE) {
					Set<String> previousContributors = helper.getContributors();
					newContributors = helper.findNewContributors(contributors, previousContributors);
					helper.saveContributors(contributors);
					return true;
				}
				helper.saveContributors(contributors);
			}
		} catch (Exception e) {
			return false;
		}
		newContributors = new HashSet<>();
		return false;
	}

	/**
	 * @return The set of the ids of config extensions which are new since the last time
	 * intro was opened. May be null if there are no contributors.
	 */
	public static Set<String> getNewContributors() {
		if (!detectorCalled) {
		    detectorCalled = true;
		    new ContentDetector().isNewContentAvailable();
	    }
		return newContributors;
	}

	/**
	 * Test to see if this contribution was newly installed
	 * @param contributionId
	 * @return
	 */
	public static boolean isNew(String contributionId) {
		if (!detectorCalled) {
			detectorCalled = true;
			new ContentDetector().isNewContentAvailable();
		}
		return newContributors != null && newContributors.contains(contributionId);
	}

}
