/*******************************************************************************
 *  Copyright (c) 2000, 2017 IBM Corporation and others.
 *
 *  This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License 2.0
 *  which accompanies this distribution, and is available at
 *  https://www.eclipse.org/legal/epl-2.0/
 *
 *  SPDX-License-Identifier: EPL-2.0
 * 
 *  Contributors:
 *      IBM Corporation - initial API and implementation
 *      Felix Riegger (SAP AG) - consolidation of publishers for PDE formats (bug 331974)
 *******************************************************************************/
package org.eclipse.equinox.p2.publisher.eclipse;

import org.eclipse.equinox.p2.metadata.Version;
import org.eclipse.equinox.p2.metadata.VersionRange;

/**
 */
public class FeatureEntry implements IPlatformEntry {
	private final String id;
	private String versionOrRange;
	private String url;
	private String os;
	private String ws;
	private String arch;
	private String nl;
	private String match;
	private final boolean isPlugin;
	private boolean isFragment = false;
	private boolean isRequires = false;
	private Boolean unpack = null;
	private boolean optional = false;
	private boolean isPatch = false;
	/**
	 * Temporary field to add provorg.eclipse.pde.internal.publishing.model.filters to features
	 */
	private String filter;

	public static FeatureEntry createRequires(String id, String version, String match, String filter, boolean isPlugin) {
		FeatureEntry result = new FeatureEntry(id, version, isPlugin);
		result.match = match;
		result.isRequires = true;
		// for requires we don't care what the form is so leave it as false (JAR'd)
		result.unpack = false;
		if (filter != null)
			result.setFilter(filter);
		return result;
	}

	public static FeatureEntry createRequires(String id, VersionRange versionRange, String match, String filter, boolean isPlugin) {
		FeatureEntry result = new FeatureEntry(id, versionRange, isPlugin);
		result.match = match;
		result.isRequires = true;
		// for requires we don't care what the form is so leave it as false (JAR'd)
		result.unpack = false;
		if (filter != null)
			result.setFilter(filter);
		return result;
	}

	public FeatureEntry(String id, String version, boolean isPlugin) {
		this.id = id;
		this.versionOrRange = Version.parseVersion(version).toString();
		this.isPlugin = isPlugin;
	}

	public FeatureEntry(String id, VersionRange versionRange, boolean isPlugin) {
		this.id = id;
		this.versionOrRange = versionRange.toString();
		this.isPlugin = isPlugin;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final FeatureEntry other = (FeatureEntry) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (versionOrRange == null) {
			if (other.versionOrRange != null)
				return false;
		} else if (!versionOrRange.equals(other.versionOrRange))
			return false;

		if (isPlugin() != other.isPlugin())
			return false;
		if (isRequires() != other.isRequires())
			return false;
		return true;
	}

	@Override
	public String getArch() {
		return arch;
	}

	/**
	 * Temporary method to add provisioning filters to features
	 */
	public String getFilter() {
		return filter;
	}

	public String getId() {
		return id;
	}

	public String getMatch() {
		return match;
	}

	@Override
	public String getNL() {
		return nl;
	}

	@Override
	public String getOS() {
		return os;
	}

	public String getURL() {
		return url;
	}

	public String getVersion() {
		return versionOrRange;
	}

	@Override
	public String getWS() {
		return ws;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((versionOrRange == null) ? 0 : versionOrRange.hashCode());
		return result;
	}

	public boolean isFragment() {
		return isFragment;
	}

	public boolean isOptional() {
		return optional;
	}

	public boolean isPlugin() {
		return isPlugin;
	}

	public boolean isRequires() {
		return isRequires;
	}

	public boolean isUnpack() {
		return (unpack == null || unpack.booleanValue());
	}

	public void setEnvironment(String os, String ws, String arch, String nl) {
		this.os = os;
		this.ws = ws;
		this.arch = arch;
		this.nl = nl;
	}

	/**
	 * Temporary method to add provisioning filters to features
	 */
	public void setFilter(String filter) {
		this.filter = filter;

	}

	public void setFragment(boolean value) {
		isFragment = value;
	}

	public void setOptional(boolean value) {
		optional = value;
	}

	public void setUnpack(boolean value) {
		unpack = Boolean.valueOf(value);
	}

	public void setURL(String value) {
		url = value;
	}

	public void setVersion(String value) {
		versionOrRange = Version.parseVersion(value).toString();
	}

	@Override
	public String toString() {
		StringBuilder result = new StringBuilder();
		result.append(isRequires ? "Requires: " : ""); //$NON-NLS-1$ //$NON-NLS-2$
		result.append(isPlugin ? "Plugin: " : "Feature: "); //$NON-NLS-1$ //$NON-NLS-2$
		result.append(id != null ? id.toString() : ""); //$NON-NLS-1$
		result.append(versionOrRange != null ? " " + versionOrRange.toString() : ""); //$NON-NLS-1$ //$NON-NLS-2$
		return result.toString();
	}

	public boolean unpackSet() {
		return unpack != null;
	}

	public boolean isPatch() {
		return isPatch;
	}

	public void setPatch(boolean patch) {
		this.isPatch = patch;
	}
}
