/*******************************************************************************
 *  Copyright (c) 2006, 2022 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
 *******************************************************************************/
package org.eclipse.pde.internal.core;

import java.util.Map.Entry;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.pde.core.IModelProviderEvent;
import org.eclipse.pde.internal.core.feature.WorkspaceFeatureModel;
import org.eclipse.pde.internal.core.ifeature.IFeatureModel;
import org.eclipse.pde.internal.core.project.PDEProject;

public class WorkspaceFeatureModelManager extends WorkspaceModelManager<IFeatureModel> {

	@Override
	protected boolean isInterestingProject(IProject project) {
		return isFeatureProject(project);
	}

	@Override
	protected void createModel(IProject project, boolean notify) {
		IFile featureXml = PDEProject.getFeatureXml(project);
		if (featureXml.exists()) {
			IFeatureModel model = new WorkspaceFeatureModel(featureXml);
			loadModel(model, false);
			getModelsMap().put(project, model);
			if (notify) {
				addChange(model, IModelProviderEvent.MODELS_ADDED);
			}
		}
	}

	@Override
	protected IFeatureModel removeModel(IProject project) {
		IFeatureModel model = getModelsMap().remove(project);
		addChange(model, IModelProviderEvent.MODELS_REMOVED);
		return model;
	}

	@Override
	protected void handleFileDelta(IResourceDelta delta) {
		IFile file = (IFile) delta.getResource();
		IProject project = file.getProject();
		IFile featureXml = PDEProject.getFeatureXml(project);
		if (file.equals(featureXml)) {
			IFeatureModel model = getModel(project);
			int kind = delta.getKind();
			if (kind == IResourceDelta.REMOVED && model != null) {
				removeModel(project);
			} else if (kind == IResourceDelta.ADDED || model == null) {
				createModel(file.getProject(), true);
			} else if (kind == IResourceDelta.CHANGED && (IResourceDelta.CONTENT & delta.getFlags()) != 0) {
				loadModel(model, true);
				addChange(model, IModelProviderEvent.MODELS_CHANGED);
			}
		}
	}

	protected IFeatureModel[] getFeatureModels() {
		initialize();
		return getModelsMap().values().toArray(new IFeatureModel[getModelsMap().size()]);
	}

	public void removeModel(IFeatureModel iFeatureModel) {
		for (Entry<IProject, IFeatureModel> entry : getModelsMap().entrySet()) {
			if (entry.getValue() == iFeatureModel) {
				this.removeModel(entry.getKey());
				break;
			}
		}
	}
}
