/**
 * Copyright (c) 2009, 2019 Mia-Software and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *     Gregoire DUPE (Mia-Software) - initial API and implementation
 */
package org.eclipse.modisco.infra.facet.core;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EValidator;
import org.eclipse.modisco.infra.common.core.internal.builder.EcoreCatalog;
import org.eclipse.modisco.infra.common.core.internal.builder.AbstractMoDiscoCatalog.ModiscoCatalogChangeListener;
import org.eclipse.modisco.infra.facet.FacetPackage;
import org.eclipse.modisco.infra.facet.FacetSet;
import org.eclipse.modisco.infra.facet.core.internal.Activator;
import org.eclipse.modisco.infra.facet.validation.EValidatorAdapter;
import org.eclipse.modisco.infra.query.core.ModelQuerySetCatalog;

/**
 * @deprecated Replaced by EMF Facet
 */
@Deprecated
public final class FacetSetCatalog extends EcoreCatalog implements ModiscoCatalogChangeListener {

	public static final String REGISTRATION_EXTENSION_POINT_ID = "org.eclipse.modisco.infra.facet.registration"; //$NON-NLS-1$

	public static final String FILE_EXTENSION = "facetSet"; //$NON-NLS-1$

	private static FacetSetCatalog singleton = null;

	public static synchronized FacetSetCatalog getSingleton() {
		if (FacetSetCatalog.singleton == null) {
			EValidator validator = EValidator.Registry.INSTANCE
					.getEValidator(FacetPackage.eINSTANCE);
			if (validator == null) {
				// Registers the validator adapter in the EMF validator registry
				EValidator.Registry.INSTANCE.put(FacetPackage.eINSTANCE, new EValidatorAdapter());
			}
			EcoreCatalog.getSingleton();
			ModelQuerySetCatalog.getSingleton();
			FacetSetCatalog.singleton = new FacetSetCatalog();
		}
		return FacetSetCatalog.singleton;
	}

	private HashMap<EPackage, HashSet<FacetSet>> ePackageToDefaultFacetSetMap;

	public synchronized Map<EPackage, HashSet<FacetSet>> getEPackageToDefaultFacetSetMap() {
		if (this.ePackageToDefaultFacetSetMap == null) {
			this.ePackageToDefaultFacetSetMap = new HashMap<EPackage, HashSet<FacetSet>>();
		}
		return this.ePackageToDefaultFacetSetMap;
	}

	private FacetSetCatalog() {
		super();
		addChangeListener(this);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected String getRootObjectName(final EObject rootObject) {
		return ((FacetSet) rootObject).getName();
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected String getRootObjectNsUri(final EObject rootObject) {
		return ((FacetSet) rootObject).getNsURI();
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected Class<?> getRootClass() {
		return FacetSet.class;
	}

	/**
	 * This method returns the facet set of the resource having for name the
	 * "name" parameter value.
	 *
	 * @param name
	 *            the name of a resource contained in the catalog
	 * @return return a facet set
	 */
	public FacetSet getFacetSet(final String name) {
		return (FacetSet) getRootObject(name);
	}

	/**
	 * Get the set of default {@link FacetSet}s that apply to the given
	 * {@link EPackage}.
	 *
	 * @param ePackage
	 *            the package for which matching {@link FacetSet}s will be
	 *            returned
	 * @return the set of default {@link FacetSet}s
	 */
	public Set<FacetSet> getDefaultFacetSets(final EPackage ePackage) {
		return getEPackageToDefaultFacetSetMap().get(ePackage);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected String getRegistryExtensionPoint() {
		return FacetSetCatalog.REGISTRATION_EXTENSION_POINT_ID;
	}

	/**
	 * This methods returns the facet sets of all the resources contained in the
	 * catalog.
	 *
	 * @return returns all the facet sets
	 */
	public Collection<FacetSet> getAllFacetSets() {
		Collection<FacetSet> result = new ArrayList<FacetSet>();
		for (EObject eObject : getAllRootObjects()) {
			if (eObject instanceof FacetSet) {
				FacetSet facetSet = (FacetSet) eObject;
				result.add(facetSet);
			}
		}
		return result;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected String getMoDiscoSubProtocol() {
		return "facet"; //$NON-NLS-1$
	}

	@Override
	protected synchronized void postOpenResource(final URI uri, final IFile file, final EObject root)
			throws Exception {
		super.postOpenResource(uri, file, root);
		if (root instanceof FacetSet) {
			FacetSet facetSet = (FacetSet) root;
			EAnnotation annotation = facetSet.getEAnnotation("default"); //$NON-NLS-1$
			if (annotation != null) {
				if (annotation.getReferences().size() == 1
						&& annotation.getReferences().get(0) instanceof EPackage) {
					EPackage ePackage = (EPackage) annotation.getReferences().get(0);
					HashSet<FacetSet> facetSets = getEPackageToDefaultFacetSetMap().get(ePackage);
					if (facetSets == null) {
						facetSets = new HashSet<FacetSet>();
						getEPackageToDefaultFacetSetMap().put(ePackage, facetSets);
					}
					facetSets.add(facetSet);
				}
			}
		}
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see
	 * org.eclipse.modisco.infra.common.core.internal.builder.EcoreCatalog
	 * #getActivator()
	 */
	@Override
	protected Plugin getActivator() {
		return Activator.getDefault();
	}

	@Override
	public String getFileExtension() {
		return FacetSetCatalog.FILE_EXTENSION;
	}

	public void changed(final EObject eObject, final IFile file) {
		EcoreCatalog.getSingleton().updateNotify(eObject, file);
	}

	public void added(final EObject eObject, final IFile file) {
		EcoreCatalog.getSingleton().addNotify(eObject, file);
	}

	public void removed(final IFile file) {
		EcoreCatalog.getSingleton().removeNotify(file);
	}

	@Override
	protected void postRestoreInstalledURI(final EObject modiscoResourceRoot) {
		// Bug 313309 - Installed version of Facet not in the registry after
		// deleting workspace version
		if (modiscoResourceRoot instanceof FacetSet) {
			FacetSet facetSet = (FacetSet) modiscoResourceRoot;
			String nsURI = facetSet.getNsURI();
			if (nsURI != null) {
				EPackage.Registry.INSTANCE.put(nsURI, facetSet);
			}
		}
	}
}