/*******************************************************************************
 * Copyright (c) 2008, 2011 Oracle Corporation.
 * All rights reserved. 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:
 *    Cameron Bateman - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.facelet.core.internal.util;

import java.util.Iterator;

import org.eclipse.core.resources.IProject;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.jst.jsf.common.metadata.Entity;
import org.eclipse.jst.jsf.common.metadata.Model;
import org.eclipse.jst.jsf.common.metadata.Trait;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataDomainContext;
import org.eclipse.jst.jsf.common.metadata.query.internal.MetaDataQueryContextFactory;
import org.eclipse.jst.jsf.common.metadata.query.internal.MetaDataQueryFactory;
import org.eclipse.jst.jsf.common.metadata.query.internal.taglib.ITaglibDomainMetaDataQuery;
import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData;
import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;

/**
 * Loads tag meta-data.
 * 
 * @author cbateman
 * 
 */
public class TagMetadataLoader
{
    private static final String PALETTE_INFOS      = "paletteInfos"; //$NON-NLS-1$

    private static final String TRAIT_DISPLAY_NAME = "displayName"; //$NON-NLS-1$

    private static final String TRAIT_DESCRIPTION  = "description"; //$NON-NLS-1$

    private static final String TRAIT_ADDITIONALELEMENTDATA = "additionalElementData"; //$NON-NLS-1$
    
    private final IProject      _project;

    /**
     * @param project
     */
    public TagMetadataLoader(final IProject project)
    {
        _project = project;
    }

    /**
     * @param nsUri
     * @param tagName
     * @return the display name for tagName or null if not found.
     */
    public String getDisplayName(final String nsUri, final String tagName)
    {
        return getString(nsUri, tagName, TRAIT_DISPLAY_NAME);
    }

    /**
     * @param nsUri
     * @param tagName
     * @return the description for tagName or null if not found.
     */
    public String getDescription(final String nsUri, final String tagName)
    {
        return getString(nsUri, tagName, TRAIT_DESCRIPTION);
    }

    /**
     * @param nsUri
     * @param tagName
     * @return attribute data identified by the name or null.
     */
    public ElementData getElementData(final String nsUri,
            final String tagName)
    {
		final IMetaDataDomainContext context = MetaDataQueryContextFactory.getInstance().createTaglibDomainModelContext(_project);
		final ITaglibDomainMetaDataQuery query = MetaDataQueryFactory.getInstance().createQuery(context);
		final Entity entity = query.getQueryHelper().getEntity(nsUri, tagName);

//        final ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper
//                .createMetaDataModelContext(_project, nsUri);
//
//        final Entity entity = TaglibDomainMetaDataQueryHelper.getEntity(
//                modelContext, tagName);

        if (entity != null)
        {
            Trait trait = query.findTrait(entity, TRAIT_ADDITIONALELEMENTDATA);
//                TaglibDomainMetaDataQueryHelper.getTrait(entity, TRAIT_ADDITIONALELEMENTDATA);
            if (trait != null)
            {
                EObject value= trait.getValue();
                if (value instanceof ElementData)
                {
                    return (ElementData) value;
                }
            }
        }
        return null;
    }

    private String getString(final String nsUri, final String tagName,
            final String key)
    {
        String value = null;
		final IMetaDataDomainContext context = MetaDataQueryContextFactory.getInstance().createTaglibDomainModelContext(_project);
		final ITaglibDomainMetaDataQuery query = MetaDataQueryFactory.getInstance().createQuery(context);
        final Model model = getModel(query, nsUri);
        if (model != null)
        {
            value = getString(query, key, model, tagName);
        }
        return value;
    }

    private String getString(final ITaglibDomainMetaDataQuery query, final String key, final Model model,
            final String tagName)
    {
        String value = null;

        // use palette infos if available
        final Trait trait = query.findTrait(model,
                PALETTE_INFOS);
        if (trait != null)
        {
            final PaletteInfos tags = (PaletteInfos) trait.getValue();
            for (final Iterator it = tags.getInfos().iterator(); it.hasNext();)
            {
                final PaletteInfo tag = (PaletteInfo) it.next();
                if (tag.getId().equalsIgnoreCase(tagName))
                {
                    final EStructuralFeature feature = tag.eClass()
                            .getEStructuralFeature(key);
                    if (feature != null)
                    {
                        if (tag.eIsSet(feature))
                        {
                            final Object strValue = tag.eGet(feature);
                            if (strValue instanceof String)
                            {
                                value = (String) strValue;
                            }
                        }
                    }
                }
            }
        }
        return value;
    }

    private Model getModel(final ITaglibDomainMetaDataQuery query, final String nsUri)
    {
    	final Model model = query.findTagLibraryModel(nsUri);
//        final ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper
//                .createMetaDataModelContext(_project, nsUri);
//        final Model model = TaglibDomainMetaDataQueryHelper
//                .getModel(modelContext);
        // no caching at this time so there is no need to listen to model
        // notifications
        // if (model != null && !hasAdapter(model))
        // addAdapter(model);
    	
        return model;
    }
}
