//------------------------------------------------------------------------------
// Copyright (c) 2005, 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.importing.services;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.epf.authoring.ui.preferences.LibraryLocationData;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.MethodPlugin;


/**
 * Encapsulates the input data required to import a method plug-in.
 * 
 * @author Jinhua Xi
 * @since 1.0
 */
public class PluginImportData {

	// these are set by the wizard
	public LibraryLocationData llData = new LibraryLocationData();

	public boolean deleteExistingPlugins;

	// these are filled in by the importing service
	public String libraryVersion;

	private List plugins = new ArrayList();

	private List configs = new ArrayList();

	private ErrorInfo error = new ErrorInfo();

	// ap the guid to url for base plugin, this is the only formation available
	public Map basePluginUrlMap = new HashMap();

	/**
	 * Creates a new instance.
	 */
	public PluginImportData() {
	}

	/**
	 * Clears the contents.
	 */
	public void clear() {
		plugins.clear();
		configs.clear();
		error.errorMessage.setLength(0);
	}

	/**
	 * Validates the plugins.
	 */
	public void validatePlugins() {
		PluginInfo info;
		int i = 0;
		while (i < plugins.size()) {
			info = (PluginInfo) plugins.get(i);
			if (info.url == null) {
				plugins.remove(i);
			} else {
				i++;
			}
		}
	}

	/**
	 * Returns a PluginInfo object given the guid.
	 */
	public PluginInfo getPluginInfo(String guid) {
		PluginInfo info;
		for (Iterator it = plugins.iterator(); it.hasNext();) {
			info = (PluginInfo) it.next();
			if (info.guid.equals(guid)) {
				return info;
			}
		}

		return null;
	}

	/**
	 * Removes a PluginInfo object given the guid.
	 */
	public void removePluginInfo(String guid) {
		PluginInfo info;
		for (Iterator it = plugins.iterator(); it.hasNext();) {
			info = (PluginInfo) it.next();
			if (info.guid.equals(guid)) {
				plugins.remove(info);
				break;
			}
		}

	}

	/**
	 * Returns a ConfiguarationInfo object given the guid.
	 */
	public ConfiguarationInfo getConfigInfo(String guid) {

		if ( guid == null ) {
			return null;
		}
		PluginImportData.ConfiguarationInfo cinfo;
		for (Iterator it = getConfigs().iterator(); it.hasNext();) {
			cinfo = (PluginImportData.ConfiguarationInfo) it.next();
			if (guid.equals(cinfo.guid) ) {
				return cinfo;
			}
		}
		
		return null;
	}
	
	
	/**
	 * return a list of PluginInfo object
	 * 
	 * @return List a list of PluginInfo objects
	 */
	public List getPlugins() {
		return plugins;
	}

	/**
	 * return a list of ConfigInfo objects
	 * 
	 * @return List
	 */
	public List getConfigs() {
		return configs;
	}

	/**
	 * return the error message if any
	 * 
	 * @return String
	 */
	public ErrorInfo getErrorInfo() {
		return error;
	}

	public class PluginInfo {

		// If not null, this is a valid plug-in.
		public String url = null;

		public String name;

		public String guid;

		public String version;

		public String brief_desc;

		public String authors;

		public String changeDate;

		public List usedPlugins = new ArrayList();

		// If null, this plug-in does not exists in the current library.
		public MethodPlugin existingPlugin = null;

		// If true, replace the current plug-in with the one in the import
		// library. If false, don't import the plug-in.
		public boolean selected = false;

		public PluginInfo() {
		}

		public String toString() {
			return name;
		}
	}

	public class ConfiguarationInfo {

		public String name;

		public String guid;

		public String version;

		// The current configuration.
		public MethodConfiguration existingConfig = null;

		public boolean selected = true;

		public ConfiguarationInfo() {
		}

	}

	public class ErrorInfo {

		private StringBuffer errorMessage = new StringBuffer();

		public ErrorInfo() {

		}

		public void addError(String message) {
			errorMessage.append(message);
		}

		public String getError() {
			return errorMessage.toString();
		}

		public void clear() {
			errorMessage.setLength(0);
		}
	}

}
