/*******************************************************************************
 * Copyright (c) 2007, 2010 Intel 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:
 * Intel Corporation - Initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.internal.core.settings.model;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.cdt.core.settings.model.extension.CDataObject;
import org.eclipse.cdt.core.settings.model.util.IPathSettingsContainerListener;
import org.eclipse.cdt.core.settings.model.util.PathSettingsContainer;
import org.eclipse.core.runtime.IPath;

public class CfgProxyCache implements IProxyCache {
	private HashMap<String, CDataProxy> fProxyMap = new HashMap<String, CDataProxy>();
	private PathSettingsContainer fPathContainer;

	CfgProxyCache(PathSettingsContainer pathDesContainer){
		fPathContainer = pathDesContainer;
		fPathContainer.addContainerListener(new IPathSettingsContainerListener(){
			@Override
			public void aboutToRemove(PathSettingsContainer container) {
				CDataProxy proxy = (CDataProxy)container.getValue();
				if(proxy != null)
					fProxyMap.remove(proxy.getId());
			}

			@Override
			public void containerAdded(PathSettingsContainer container) {
			}

			@Override
			public void containerValueChanged(PathSettingsContainer container, Object oldValue) {
				CDataProxy proxy = (CDataProxy)container.getValue();
				if(proxy != null)
					fProxyMap.put(proxy.getId(),proxy);
				else if(oldValue != null){
					fProxyMap.remove(oldValue);
				}
			}

			@Override
			public void containerPathChanged(PathSettingsContainer container, IPath oldPath, boolean childrenMoved) {
				// TODO Auto-generated method stub

			}
		});
	}

	@Override
	public void addCachedProxy(CDataProxy proxy) {
		if(proxy instanceof IInternalResourceDescription){
			IInternalResourceDescription des = (IInternalResourceDescription)proxy;
			IPath path = des.getPath();
			PathSettingsContainer cr = fPathContainer.getChildContainer(path, true, true);
			cr.setValue(des);
			des.setPathContainer(cr);
		} else {
			fProxyMap.put(proxy.getId(), proxy);
		}
	}

	@Override
	public void clear() {
		fPathContainer.removeChildren();
		fProxyMap.clear();
	}

	@Override
	public CDataProxy[] getCachedProxies() {
		Collection<CDataProxy> c = fProxyMap.values();
		return c.toArray(new CDataProxy[c.size()]);
	}

	@Override
	public CDataProxy getCachedProxy(String id) {
		return fProxyMap.get(id);
	}

	@Override
	public void removeCachedProxy(String id) {
		CDataProxy proxy = fProxyMap.get(id);
		removeCachedProxy(proxy);
	}

	@Override
	@SuppressWarnings("unchecked")
	public Map<String, CDataProxy> getCachedProxiesMap() {
		return (Map<String, CDataProxy>)fProxyMap.clone();
	}

	@Override
	public CDataProxy getCachedProxy(CDataObject data) {
		return getCachedProxy(data.getId());
	}

	@Override
	public void removeCachedProxy(CDataProxy proxy) {
		if(proxy instanceof IInternalResourceDescription){
			fPathContainer.removeChildContainer(((IInternalResourceDescription)proxy).getCachedPath());
		} else {
			fProxyMap.remove(proxy.getId());
		}
	}

//	public Map reuseProxies(List dataList, Map freeProxyMap) {
//		Collection proxies = freeProxyMap.values();
//		CDataProxy proxy;
//		CDataObject data;
//		Map result;
//		for(Iterator dataIter = dataList.iterator(); dataIter.hasNext();){
//			data = (CDataObject)dataIter.next();
//			for(Iterator proxyIter = proxies.iterator(); proxyIter.hasNext();){
//				proxy = (CDataProxy)proxyIter.next();
//				if(data.getType() != proxy.getType())
//					continue;
//
//				switch(data.getType()){
//				case ICSettingBase.SETTING_TARGET_PLATFORM:
//				case ICSettingBase.SETTING_FILE:
//				case ICSettingBase.SETTING_FOLDER:
////					if(((CResourceData)data).getPath().equals(((CResourceDescription)proxy).getPath()))
//				}
//
//				if(result == null)
//					result = new HashMap();
//
//
//			}
//		}
//	}
}

