/*******************************************************************************
 * Copyright (c) 2012, 2013 Oracle. 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:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.common.core.internal;

import java.util.HashSet;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jpt.common.core.JptResourceType;
import org.eclipse.jpt.common.core.JptResourceTypeManager;
import org.eclipse.jpt.common.utility.internal.comparator.ComparatorTools;
import org.eclipse.jpt.common.utility.internal.iterable.SuperIterableWrapper;
import com.ibm.icu.text.Collator;

/**
 * Resource type.
 */
public class InternalJptResourceType
	implements JptResourceType
{
	private final InternalJptResourceTypeManager manager;
	private final String id;
	private final IContentType contentType;
	private final String version;
	private /* final */ String pluginId;

	// ignore duplicates
	private /* final */ HashSet<InternalJptResourceType> baseTypes;


	InternalJptResourceType(InternalJptResourceTypeManager manager, String id, IContentType contentType, String version) {
		super();
		this.manager = manager;
		this.id = id;
		this.contentType = contentType;
		this.version = version;
	}


	public JptResourceTypeManager getManager() {
		return this.manager;
	}

	public String getId() {
		return this.id;
	}

	public IContentType getContentType() {
		return this.contentType;
	}

	public String getVersion() {
		return this.version;
	}

	void setPluginId(String pluginId) {
		this.pluginId = pluginId;
	}

	public String getPluginId() {
		return this.pluginId;
	}

	void setBaseTypes(HashSet<InternalJptResourceType> baseTypes) {
		this.baseTypes = baseTypes;
	}

	public Iterable<JptResourceType> getBaseTypes() {
		return new SuperIterableWrapper<JptResourceType>(this.baseTypes);
	}

	public boolean isKindOf(JptResourceType resourceType) {
		return this.isKindOf_(resourceType) ||
				this.extends_(resourceType);
	}

	private boolean isKindOf_(JptResourceType resourceType) {
		return this.contentType.isKindOf(resourceType.getContentType()) &&
				this.versionIsGTE(resourceType);
	}

	private boolean versionIsGTE(JptResourceType resourceType) {
		return this.compareVersionTo(resourceType.getVersion()) >= 0;
	}

	private boolean extends_(JptResourceType resourceType) {
		for (JptResourceType baseType : this.baseTypes) {
			if (baseType.isKindOf(resourceType)) {
				return true;
			}
		}
		return false;
	}

	public int compareTo(JptResourceType resourceType) {
		int result = Collator.getInstance().compare(this.contentType, resourceType.getContentType());
		return (result != 0) ? result : this.compareVersionTo(resourceType.getVersion());
	}

	/**
	 * {@link #UNDETERMINED_VERSION} is less than any other version.
	 */
	private int compareVersionTo(String v) {
		if (this.version.equals(UNDETERMINED_VERSION)) {
			return v.equals(UNDETERMINED_VERSION) ? 0 : -1;
		}
		if (v.equals(UNDETERMINED_VERSION)) {
			return 1;
		}
		return ComparatorTools.integerVersionComparator().compare(this.version, v);
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append(this.contentType.getName());
		if ( ! this.version.equals(UNDETERMINED_VERSION)) {
			sb.append(' ');
			sb.append(this.version);
		}
		return sb.toString();
	}
}
