/*******************************************************************************
 * Copyright (c) 2008 Oracle Corporation.
 * 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:
 *    Xiaonan Jiang/IBM  -- extracted from https://bugs.eclipse.org/bugs/show_bug.cgi?id=206514
 *    Cameron Bateman/Oracle - integrated.
 * 
 ********************************************************************************/
package org.eclipse.jst.jsf.designtime.internal.symbols;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.core.resources.IProject;
import org.eclipse.jst.jsf.context.symbol.ISymbol;
import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigManager;
import org.eclipse.jst.jsf.designtime.el.AbstractDTPropertyResolver;
import org.eclipse.jst.jsf.designtime.el.DefaultDTPropertyResolver;
import org.eclipse.jst.jsf.designtime.el.IDecorativeResolver;
import org.eclipse.jst.jsf.designtime.el.IInstancePerProjectResolver;

/**
 * A design time proxy for the runtime ProperyResolver.
 * 
 * @author xnjiang
 * 
 */
public class ConfigBasedDTPropertyResolver extends DefaultDTPropertyResolver
        implements IInstancePerProjectResolver
{
    private IProject _project;

    /**
     * Constructor
     * 
     */
    public ConfigBasedDTPropertyResolver()
    {
        super();
    }

    @Override
    public ISymbol[] getAllProperties(final ISymbol base)
    {
        final Map<String, ISymbol> allSymbols = new HashMap<String, ISymbol>();
        final ISymbol[] superSymbols = super.getAllProperties(base);
        for (final ISymbol superSymbol : superSymbols)
        {
            allSymbols.put(superSymbol.getName(), superSymbol);
        }

        if (JSFCorePlugin.hasDecorativePropertyResolvers())
        {
            final List<AbstractDTPropertyResolver> resolvers = retrieveDecorativePropertyResolvers(_project);
            for (final AbstractDTPropertyResolver resolver : resolvers)
            {
                final ISymbol[] otherSymbols = resolver.getAllProperties(base);
                for (final ISymbol otherSymbol : otherSymbols)
                {
                    // allow subsequent resolvers to replace symbols by name
                    // added previously
                    allSymbols.put(otherSymbol.getName(), otherSymbol);
                }
            }
        }
        return allSymbols.values().toArray(ISymbol.EMPTY_SYMBOL_ARRAY);

    }

    @Override
    public ISymbol getProperty(final ISymbol base, final int offset)
    {
        if (JSFCorePlugin.hasDecorativePropertyResolvers())
        {
            final List<AbstractDTPropertyResolver> resolvers = retrieveDecorativePropertyResolvers(_project);

            // we need to iterate backwards through the resolvers, since
            // the we take the first answer we receive.
            for (int i = resolvers.size() - 1; i >= 0; i--)
            {
                final ISymbol symbol = resolvers.get(i).getProperty(base,
                        offset);
                if (symbol != null)
                {
                    return symbol;
                }
            }
        }
        return super.getProperty(base, offset);
    }

    @Override
    public ISymbol getProperty(final ISymbol base, final Object propertyId)
    {
        if (JSFCorePlugin.hasDecorativePropertyResolvers())
        {
            final List<AbstractDTPropertyResolver> resolvers = retrieveDecorativePropertyResolvers(_project);

            // we need to iterate backwards through the resolvers, since
            // the we take the first answer we receive.
            for (int i = resolvers.size() - 1; i >= 0; i--)
            {
                final ISymbol symbol = resolvers.get(i).getProperty(base,
                        propertyId);
                if (symbol != null)
                {
                    return symbol;
                }
            }
        }
        return super.getProperty(base, propertyId);
    }

    private List<AbstractDTPropertyResolver> retrieveDecorativePropertyResolvers(
            final IProject project)
    {
        final JSFAppConfigManager manager = JSFAppConfigManager
                .getInstance(project);
        final List<String> propertyResolvers = manager.getPropertyResolvers();
        final List<AbstractDTPropertyResolver> resolvers = new ArrayList<AbstractDTPropertyResolver>();
        for (final String propertyResolver : propertyResolvers)
        {
            final List<String> ids = JSFCorePlugin
                    .getPropertyResolversForName(propertyResolver);

            for (final String id : ids)
            {
                final AbstractDTPropertyResolver resolver = JSFCorePlugin
                        .getPropertyResolver(id).getInstance(_project);
                if (resolver instanceof IDecorativeResolver)
                {
                    resolvers.add(resolver);
                }
                else
                {
                    JSFCorePlugin.log(new Exception(), String.format("resolver %s must implement the IDecorativeResolver interface to be used", id));
                }
            }
        }
        return resolvers;
    }

    public void setProject(final IProject project)
    {
        _project = project;
    }

    // private void retrievePropertyResolver() {
    // try {
    // String str =
    // project.getPersistentProperty(PERSIST_PROPERTY_KEY_PROPERTY_RESOLVERS);
    // if (str != null) {
    // resolvers = new ArrayList<AbstractDTPropertyResolver>();
    // StringTokenizer tokenizer = new StringTokenizer(str, ",");//$NON-NLS-1$
    // while (tokenizer.hasMoreTokens()) {
    // AbstractDTPropertyResolver resolver =
    // JSFCorePlugin.getPropertyResolvers().get(tokenizer.nextToken());
    // if (resolver != null) {
    // resolvers.add(resolver);
    // }
    // }
    // } else {
    // checkFacesConfigForPropertyResolver();
    // }
    // } catch (CoreException e) {
    // checkFacesConfigForPropertyResolver();
    // }
    // }
    //
    // private void checkFacesConfigForPropertyResolver() {
    // resolvers = new ArrayList<AbstractDTPropertyResolver>();
    // String str = "";//$NON-NLS-1$
    // boolean bFirst = true;
    // List facesConfigs =
    // JSFAppConfigManager.getInstance(project).getFacesConfigModels();
    // Iterator itFacesConfigs = facesConfigs.iterator();
    // while (itFacesConfigs.hasNext()) {
    // FacesConfigType facesConfig = (FacesConfigType)itFacesConfigs.next();
    // EList applications = facesConfig.getApplication();
    // for (int i=0;i<applications.size();i++) {
    // EList resolvers2 =
    // ((ApplicationType)applications.get(i)).getPropertyResolver();
    // for (int j=0;j<resolvers2.size();j++) {
    // PropertyResolverType resolverType =
    // (PropertyResolverType)resolvers2.get(i);
    // AbstractDTPropertyResolver resolver =
    // JSFCorePlugin.getPropertyResolvers().get(resolverType.getTextContent());
    // if (resolver != null) {
    // resolvers.add(resolver);
    // if (bFirst) {
    // bFirst = false;
    // } else {
    // str += ",";//$NON-NLS-1$
    // }
    // str += resolverType.getTextContent();
    // }
    // }
    // }
    // }
    // try {
    // if (!str.equals("")) {//$NON-NLS-1$
    // project.setPersistentProperty(PERSIST_PROPERTY_KEY_PROPERTY_RESOLVERS,
    // str);
    // } else {
    // project.setPersistentProperty(PERSIST_PROPERTY_KEY_PROPERTY_RESOLVERS,
    // null);
    // }
    // } catch (CoreException e) {
    // e.printStackTrace();
    // }
    // }
    //
    // /**
    // * Called when a change in an application configuration model for which
    // * this listener has been registered occurs.
    // *
    // * @param notification EMF {@link Notification} instance that describes
    // the
    // * model change.
    // */
    // public void notifyChanged(Notification notification) {
    // checkFacesConfigForPropertyResolver();
    // }
}
