package org.eclipse.jst.jsf.designtime.internal.view.mapping;

import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.BasicExtendedMetaData;
import org.eclipse.emf.ecore.util.ExtendedMetaData;
import org.eclipse.emf.ecore.xmi.XMLHelper;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
import org.eclipse.jst.jsf.common.metadata.Entity;
import org.eclipse.jst.jsf.common.metadata.MetadataFactory;
import org.eclipse.jst.jsf.common.metadata.MetadataPackage;
import org.eclipse.jst.jsf.common.metadata.Model;
import org.eclipse.jst.jsf.common.metadata.Trait;
import org.eclipse.jst.jsf.common.runtime.internal.model.types.ClassTypeInfo;
import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ClassTypeInfo_;
import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingFactory;
import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.ComponentMappingPackage;
import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagMapping;
import org.eclipse.jst.jsf.designtime.internal.view.mapping.viewmapping.TagToViewObjectMapping;

/**
 * Generates View metadata from common.runtime objects.
 * 
 * @author cbateman
 * 
 */
public class ViewMetadataGenerator
{
    private final ResourceSet      _resourceSet;
    private final ExtendedMetaData _extendedMetadata;
    private final Model            _root;
    private final ViewMetadataMapper   _mapper;

    /**
     * @param uri
     */
    public ViewMetadataGenerator(final String uri)
    {
        _root = MetadataFactory.eINSTANCE.createModel();
        _root.setId(uri);
        _root.setType("tagFile");
        _resourceSet = new ResourceSetImpl();
        _mapper = new ViewMetadataMapper();
        _extendedMetadata = new BasicExtendedMetaData(_resourceSet
                .getPackageRegistry());

        // Register the appropriate resource factory to handle all file
        // extensions.
        //
        _resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap()
                .put(Resource.Factory.Registry.DEFAULT_EXTENSION,
                        new XMLResourceFactoryImpl());
    }

    /**
     * The format of the strings should match OSGI version:
     * 
     * MAJOR . MINOR . BUILD . QUALIFIER
     * 
     * @param tagName
     * @param typeInfo
     * @param minJSFVersion
     *            the minimum JSF version, null for DEFAULT.
     * @param minLibVersion
     *            the minimum library version, null for NONE.
     */
    public void addTagToViewObjectMapping(final String tagName,
            final ClassTypeInfo typeInfo, final String minJSFVersion,
            final String minLibVersion)
    {
        final ClassTypeInfo_ metadata = _mapper.mapToMetadata(typeInfo);

        if (metadata != null)
        {
            final TagToViewObjectMapping viewMapping =
                ComponentMappingFactory.eINSTANCE.createTagToViewObjectMapping();
            if (minJSFVersion != null)
            {
                viewMapping.setMinJSFVersion(minJSFVersion);
            }
            viewMapping.setMinLibraryVersion(minLibVersion);
            viewMapping.setTypeInfo(metadata);

            final TagMapping tagMapping = findOrCreateTagMapping(tagName);
            tagMapping.getVersionedTagToViewMappings().add(viewMapping);

            final Trait trait = MetadataFactory.eINSTANCE.createTrait();
            trait.setId(ViewMetadataMapper.DEFAULT_MAPPING_TRAIT_ID);
            trait.setValue(tagMapping);

            final Entity entity = MetadataFactory.eINSTANCE.createEntity();
            entity.setId(tagName);
            entity.setType("tag");
            entity.getTraits().add(trait);

            _root.getChildEntities().add(entity);
        }
    }

    private TagMapping findOrCreateTagMapping(final String tagName)
    {
        for (final Entity entity : (List<Entity>)_root.getChildEntities())
        {
            if (entity.getId().equals(tagName))
            {
                for (final Trait trait : (List<Trait>)entity.getTraits())
                {
                    if (trait.getId().equals(ViewMetadataMapper.DEFAULT_MAPPING_TRAIT_ID))
                    {
                        return (TagMapping) trait.getValue();
                    }
                }
            }
        }
        return ComponentMappingFactory.eINSTANCE.createTagMapping();
    }

    /**
     * @param out
     * @throws IOException
     */
    public void save(final OutputStream out) throws IOException
    {
        final Resource res = new XMLResourceImpl()
        {
            @Override
            protected XMLHelper createXMLHelper()
            {
                return new XMLHelperImpl()
                {
                    public String getHREF(EObject obj)
                    {
                        return ComponentMappingPackage.eNS_URI;
                    }

                    @Override
                    public EPackage getNoNamespacePackage()
                    {
                        return MetadataPackage.eINSTANCE;
                    }
                };
            }
        };// _resourceSet.createResource(URI.createURI("foo.xml"));
        res.getContents().add(_root);
        // res.setURI(uri);
        // resourceSet.getResources().add(res);
        // setLoadOptions(res);
        Map options = new HashMap();
        options.put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
        options.put(XMLResource.OPTION_EXTENDED_META_DATA, _extendedMetadata);
        // options.put(XMLResource.OPTION_RESOURCE_HANDLER, res);
        options.put(XMLResource.OPTION_LAX_FEATURE_PROCESSING, Boolean.TRUE);
        options.put(XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.FALSE);// turning
        // this
        // off
        // so
        // that
        // res.getErrors()
        // has
        // values
        // to
        // check!
        // bizarre
        // that
        // I
        // should
        // need
        // to
        // do
        // this.
        res.save(out, options);
    }

    // private void printHeader(final OutputStream out) throws IOException
    // {
    // final String header = "<md:metadatamodel \n"
    // + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
    // + "xmlns:ecore=\"http://www.eclipse.org/emf/2002/Ecore\""
    // +
    // "xmlns:md=\"http://org.eclipse.jst.jsf.common.metadata/metadata.ecore\""
    // +
    // "xmlns:mdt=\"http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore\"
    // "
    // +
    // "xmlns:viewMap=\"http://org.eclipse.jst.jsf.core/componentMapping.ecore\""
    // + "id=\"http://java.sun.com/jsf/html\""
    // + "type\"tagFile\">";
    // out.write(header.getBytes());
    // }
}
