/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.converter;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
import org.eclipse.jst.pagedesigner.PageDesignerTraceOptions;
import org.eclipse.jst.pagedesigner.converter.html.HTMLConverterFactory;
import org.eclipse.jst.pagedesigner.converter.jsp.JSPConverterFactory;
import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
import org.w3c.dom.Element;

/**
 * @author mengbo
 * @version 1.5
 */
public class ConverterFactoryRegistry
{
    List _factories = new ArrayList();

    private static ConverterFactoryRegistry _instance;

    /**
	 *
	 */
    private ConverterFactoryRegistry()
    {
        final List<IConverterFactory> facs = ConverterFacRegistryReader
                .getAllHandlers();
        if (facs != null)
        {
            for (final IConverterFactory fac : facs)
            {
                addFactory(fac);
            }
        }
        _factories.add(new JSPConverterFactory());
        _factories.add(new HTMLConverterFactory());
        
        // TODO: this is not ideal, but until we get a better system for 
        // doing converter factory ordering:
        // loop through the list and place the DTManager
    }

    /**
     * @param fac
     */
    public void addFactory(final IConverterFactory fac)
    {
        _factories.add(fac);
    }

    /**
     * @param ele
     * @param mode
     * @param targetDocument
     * @return the new btag converter
     */
    public ITagConverter createTagConverter(final Element ele, final int mode,
            final IDOMDocument targetDocument)
    {
        final ITagConverter converter = internalCreateTagConverter(ele, mode);
        if (converter != null)
        {
            converter.setDestDocument(targetDocument);
        }
        return converter;
    }

    /**
     * @param ele
     * @param mode
     * @return the new tag converter
     */
    protected final ITagConverter internalCreateTagConverter(final Element ele,
            final int mode)
    {
        final String uri = CMUtil.getElementNamespaceURI(ele);
        // first round, match uri
        for (int i = 0, size = _factories.size(); i < size; i++)
        {
            final IConverterFactory fac = (IConverterFactory) _factories.get(i);
            final String facuri = fac.getSupportedURI();
            if (facuri != null && facuri.equals(uri))
            {
                final ITagConverter converter = fac.createConverter(ele, mode);
                if (converter != null)
                {
                    if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
                    {
                        PageDesignerTraceOptions
                                .log("ConverterFactoryRegistry: first loop, "
                                        + String
                                                .format(
                                                        "Selected converter %s for uri=%s, tagname=%s",
                                                        converter.getClass()
                                                                .getName(),
                                                        uri, ele.getLocalName()));
                    }
                    return converter;
                }
            }
        }
        // second round
        for (int i = 0, size = _factories.size(); i < size; i++)
        {
            final IConverterFactory fac = (IConverterFactory) _factories.get(i);
            final String facuri = fac.getSupportedURI();
            if (facuri == null)
            {
                final ITagConverter converter = fac.createConverter(ele, mode);
                if (converter != null)
                {
                    if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
                    {
                        PageDesignerTraceOptions
                                .log("ConverterFactoryRegistry: second loop, "
                                        + String
                                                .format(
                                                        "Selected converter %s for uri=%s, tagname=%s",
                                                        converter.getClass()
                                                                .getName(),
                                                        uri, ele.getLocalName()));
                    }
                    return converter;
                }
            }
        }

        // can't find. We need some default tag converter for it.
        // if the tag is empty, show it as icon.
        if (uri == null || ITLDConstants.URI_HTML.equals(uri))
        {
            if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
            {
                PageDesignerTraceOptions
                        .log("ConverterFactoryRegistry: factory not found, "
                                + String
                                        .format(
                                                "Selected DumTagConverter for uri=%s, tagname=%s",
                                                uri, ele.getLocalName()));
            }

            // basically, for HTML or non JSP tag, directly renders it.
            return new DumTagConverter(ele);
        }
        final CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
        if (decl == null)
        {
            if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
            {
                PageDesignerTraceOptions
                        .log("ConverterFactoryRegistry: factory and decl not found, "
                                + String
                                        .format(
                                                "Selected DumTagConverter for uri=%s, tagname=%s",
                                                uri, ele.getLocalName()));
            }
            return new DumTagConverter(ele);
        }
        final int contentType = decl.getContentType();
        if (contentType == CMElementDeclaration.EMPTY)
        {
            if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
            {
                PageDesignerTraceOptions
                        .log("ConverterFactoryRegistry: factory not found, content is EMPTY, "
                                + String
                                        .format(
                                                "Selected HiddenTagConverter with UnknownImage for uri=%s, tagname=%s",
                                                uri, ele.getLocalName()));
            }

            // if the tag is empty, show it as icon.
            return new HiddenTagConverter(ele, new LabelProvider()
            {
                @Override
                public Image getImage(final Object element)
                {
                    return getUnknownImage();
                }
            });
        }
        if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
        {
            PageDesignerTraceOptions
                    .log("ConverterFactoryRegistry: fall-through to default case, "
                            + String
                                    .format(
                                            "Selected DefaultUnknownTagConverter with UnknownImage for uri=%s, tagname=%s",
                                            uri, ele.getLocalName()));
        }
        return new DefaultUnknownTagConverter(ele, mode);

    }

    private static Image getUnknownImage()
    {
        return JSFUICommonPlugin.getDefault().getImage(
                JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
    }

    /**
     * @return the singleton instance of the registry
     */
    public synchronized static ConverterFactoryRegistry getInstance()
    {
        if (_instance == null)
        {
            _instance = new ConverterFactoryRegistry();
        }
        return _instance;
    }
}
