package org.eclipse.jst.jsf.ui.internal.tagregistry;

import java.io.IOException;
import java.util.Collection;

import org.eclipse.jface.action.Action;
import org.eclipse.jst.jsf.common.runtime.internal.model.types.ClassTypeInfo;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IComponentTagElement;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IConverterTagElement;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IValidatorTagElement;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
import org.eclipse.jst.jsf.designtime.internal.view.mapping.ViewMetadataGenerator;

/**
 * @author cbateman
 * 
 */
class GenerateMetadataAction extends Action
{
    private Namespace _ns;

    public GenerateMetadataAction()
    {
        super("Generate metadata"); //$NON-NLS-1$
    }

    public void setNamespace(final Namespace ns)
    {
        _ns = ns;
    }

    @Override
    public void run()
    {
        if (_ns != null)
        {
            // create resource set and resource
            final ViewMetadataGenerator generator = new ViewMetadataGenerator(_ns
                    .getNSUri());
            for (final ITagElement element : (Collection<? extends ITagElement>) _ns
                    .getViewElements())
            {
                final String tagName = element.getName();
                final ClassTypeInfo typeInfo = getTypeInfo(element);
                if (typeInfo != null)
                {
                    generator.addTagToViewObjectMapping(tagName, typeInfo, null, null);
                }
            }

            try
            {
                generator.save(System.out);
            }
            catch (final IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            // final IProject project = (IProject) _viewer.getInput();
            // final ITaglibDomainMetaDataModelContext modelContext =
            // TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project,
            // "http://java.sun.com/jsf/html");
            // final Entity entity = TaglibDomainMetaDataQueryHelper.getEntity(
            // modelContext, "outputText");
            // if (entity != null)
            // {
            // final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(
            // entity, "viewElementMapping");
            // if (trait != null)
            // {
            // final TagToViewObjectMapping tagConstraint =
            // (TagToViewObjectMapping) trait.getValue();
            // System.err.println(tagConstraint.toString());
            // }
            // }

        }
    }

    private ClassTypeInfo getTypeInfo(final ITagElement element)
    {
        ClassTypeInfo typeInfo = null;
        if (element instanceof IComponentTagElement)
        {
            typeInfo = ((IComponentTagElement) element).getComponent();
        }
        else if (element instanceof IConverterTagElement)
        {
            typeInfo = ((IConverterTagElement) element).getConverter();
        }
        else if (element instanceof IValidatorTagElement)
        {
            typeInfo = ((IValidatorTagElement) element).getValidator();
        }

        return typeInfo;
    }
}
