/*******************************************************************************
 * Copyright (c) 2000, 2006 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.update.internal.model;

import java.net.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.eclipse.update.core.*;
import org.eclipse.update.core.model.*;
import org.eclipse.update.internal.core.*;

/**
 * 
 */
public class ConfigurationPolicyModel extends ModelObject {

	
	

	private int policy;
	private Map /* of FeatureReferenceModel */configuredFeatureReferences;
	private Map /* of FeatureReferenceModel */unconfiguredFeatureReferences;
	
	// since 2.0.2
	private ConfiguredSiteModel configuredSiteModel;
	
	// since 2.1
	private boolean enable;

	/**
	 * Constructor for ConfigurationPolicyModel.
	 */
	public ConfigurationPolicyModel() {
		super();
		enable = true;
		configuredFeatureReferences = new HashMap();
//		unconfiguredFeatureReferences = new HashMap();		
	}

	/**
	 * @since 2.0
	 */
	public int getPolicy() {
		return policy;
	}

	/**
	 * Sets the policy.
	 * @param policy The policy to set
	 */
	public void setPolicy(int policy) {
		assertIsWriteable();
		this.policy = policy;
	}

	/**
	 * @since 2.0
	 */
	public FeatureReferenceModel[] getConfiguredFeaturesModel() {
		if (configuredFeatureReferences==null || configuredFeatureReferences.isEmpty())
			return new FeatureReferenceModel[0];
		return (FeatureReferenceModel[]) configuredFeatureReferences.keySet().toArray(arrayTypeFor(configuredFeatureReferences.keySet()));
	}

	/**
	 * @since 2.0
	 */
	public FeatureReferenceModel[] getUnconfiguredFeaturesModel() {
		// obtain unconfigured features by comparing configured ones with those installed
		if (unconfiguredFeatureReferences == null
				&& configuredSiteModel != null
				&& configuredSiteModel.getSiteModel() != null) {
			ISite site = (ISite) configuredSiteModel.getSiteModel();
			ISiteFeatureReference[] siteFeatures = site.getFeatureReferences();
			if (siteFeatures.length > getConfiguredFeaturesModel().length) {
				for (int i=0; i<siteFeatures.length; i++) {
					if (!(siteFeatures[i] instanceof SiteFeatureReference))
						continue;
					Iterator iterator = configuredFeatureReferences.keySet().iterator();
					boolean found = false;
					while(!found && iterator.hasNext()) {
						FeatureReferenceModel f = (FeatureReferenceModel)iterator.next();
						if (UpdateManagerUtils.sameURL(f.getURL(), siteFeatures[i].getURL()))
							found = true;
					}
					if (!found)
						addUnconfiguredFeatureReference((SiteFeatureReference)siteFeatures[i]);
				}
			}
		}
		if (unconfiguredFeatureReferences == null
				|| unconfiguredFeatureReferences.isEmpty())
			return new FeatureReferenceModel[0];
		return (FeatureReferenceModel[]) unconfiguredFeatureReferences.keySet()
				.toArray(arrayTypeFor(unconfiguredFeatureReferences.keySet()));
	}

	/**
	 * Gets the configuredSiteModel.
	 * @return Returns a ConfiguredSiteModel
	 * @since 2.0.2
	 */
	public ConfiguredSiteModel getConfiguredSiteModel() {
		return configuredSiteModel;
	}

	/**
	 * Sets the configuredSiteModel.
	 * @param configuredSiteModel The configuredSiteModel to set
	 * @since 2.0.2
	 */
	public void setConfiguredSiteModel(ConfiguredSiteModel configuredSiteModel) {
		this.configuredSiteModel = configuredSiteModel;
	}

	/**
	 * 
	 */
	private boolean remove(FeatureReferenceModel feature, Map list) {
		URL featureURL = feature.getURL();
		boolean found = false;
		Iterator iter = list.keySet().iterator();
		while (iter.hasNext() && !found) {
			FeatureReferenceModel element = (FeatureReferenceModel) iter.next();
			if (UpdateManagerUtils.sameURL(element.getURL(),featureURL)) {
				list.remove(element);
				found = true;
			}
		}
		return found;
	}

	/**
	 * returns an array of string corresponding to plugins file
	 */
	/*package*/

	
	/**
	 * 
	 */
	private void add(FeatureReferenceModel feature, Map list) {
		URL featureURL = feature.getURL();
		boolean found = false;
		Iterator iter = list.keySet().iterator();
		while (iter.hasNext() && !found) {
			FeatureReferenceModel element = (FeatureReferenceModel) iter.next();
			if (UpdateManagerUtils.sameURL(element.getURL(),featureURL)) {
				found = true;
			}
		}

		if (!found) {
			list.put(feature,null);
		} else {
			UpdateCore.warn("Feature Reference :"+feature+" already part of the list."); //$NON-NLS-1$ //$NON-NLS-2$
		}
	}

	/**
	 * adds a feature in the configuredReference list
	 * also used by the parser to avoid creating another activity
	 */
	public void addConfiguredFeatureReference(FeatureReferenceModel feature) {
		assertIsWriteable();
		
		if (configuredFeatureReferences == null)
			this.configuredFeatureReferences = new HashMap();
		if (!configuredFeatureReferences.containsKey(feature)){
			//DEBUG:
			if (UpdateCore.DEBUG && UpdateCore.DEBUG_SHOW_CONFIGURATION){
				UpdateCore.debug("Configuring "+feature.getURLString()); //$NON-NLS-1$
			}
			this.add(feature, configuredFeatureReferences);
		}	

		// when user configure a feature,
		// we have to remove it from unconfigured feature if it exists
		// because the user doesn't know...
		if (unconfiguredFeatureReferences != null) {
			boolean success = remove(feature, unconfiguredFeatureReferences);
			if (!success)
				UpdateCore.warn("Feature not part of Unconfigured list: "+feature.getURLString());			 //$NON-NLS-1$
		}

	}

	/**
	 * adds a feature in the list
	 * also used by the parser to avoid creating another activity
	 */
	public void addUnconfiguredFeatureReference(FeatureReferenceModel feature) {
		assertIsWriteable();
		if (unconfiguredFeatureReferences == null)
			this.unconfiguredFeatureReferences = new HashMap();
		if (!unconfiguredFeatureReferences.containsKey(feature)){
			if (UpdateCore.DEBUG && UpdateCore.DEBUG_SHOW_CONFIGURATION){
				UpdateCore.debug("Unconfiguring "+feature.getURLString()); //$NON-NLS-1$
			}
			this.add(feature, unconfiguredFeatureReferences);
		}	

		// an unconfigured feature is always from a configured one no ?
		// unless it was parsed right ?
		if (configuredFeatureReferences != null) {
			boolean success = remove(feature, configuredFeatureReferences);
			if (!success)
				UpdateCore.warn("Feature not part of Configured list: "+feature.getURLString());				 //$NON-NLS-1$
		}
	}

	/**
	 * removes a feature from any list
	 */
	public void removeFeatureReference(FeatureReferenceModel feature) {
		assertIsWriteable();
		if (unconfiguredFeatureReferences!=null){
			boolean success = remove(feature, unconfiguredFeatureReferences);
			if (!success)
				UpdateCore.warn(feature.getURLString()+" not part of unconfigured list.");							 //$NON-NLS-1$
		}

		if (configuredFeatureReferences != null) {
			boolean success = remove(feature, configuredFeatureReferences);
			if (!success)
				UpdateCore.warn(feature.getURLString()+" not part of configured list.");							 //$NON-NLS-1$
		}
	}
	
	/**
	 * Sets the unconfiguredFeatureReferences.
	 * @param featureReferences The unconfiguredFeatureReferences to set
	 */
	protected void setUnconfiguredFeatureReferences(IFeatureReference[] featureReferences) {
		unconfiguredFeatureReferences = new HashMap();
		for (int i = 0; i < featureReferences.length; i++) {
			unconfiguredFeatureReferences.put(featureReferences[i],null);
		}
	}


	/**
	 * Sets the configuredFeatureReferences.
	 * @param featureReferences The configuredFeatureReferences to set
	 */
	protected void setConfiguredFeatureReferences(IFeatureReference[] featureReferences) {
		configuredFeatureReferences = new HashMap();
		for (int i = 0; i < featureReferences.length; i++) {
			configuredFeatureReferences.put(featureReferences[i],null);
		}		
	
	}

	/**
	 * @return boolean
	 */
	public boolean isEnabled() {
		return enable;
	}

	/**
	 * @param value
	 */
	public void setEnabled(boolean value) {
		enable = value;
	}


	
}
